微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

数组 – 如何在O(n)运行时和O(1)空间复杂度内重组数组?

我是一个’空间复杂’的新手并且遇到了问题.
假设我有一个任意整数数组:
[1,4,2,1,5]

我如何重新排序此数组以在一端具有所有零:
[1,5,0]

…并计算非零整数的计数(在这种情况下:5)?

…在O(n)运行时具有O(1)空间复杂度?

我不擅长这个.
我的背景是环境工程而不是计算机科学,所以我通常会抽象地思考.

我以为我可以做一个排序,然后计算非零整数.
然后我想我只能在重新排列数组时执行元素元素复制.
然后我想到了类似于冒泡的东西,切换相邻的元素,直到我用零结束.

我以为我可以通过移位数组成员的地址来节省’空间复杂度’,因为数组点指向数组,并且对其成员有偏移.

我要么以牺牲空间复杂性为代价来增强运行时,反之亦然.

解决方案是什么?

解决方法

Two-pointer approach解决此任务并保持在时间和内存限制之内.

首先将一个指针放在末尾,另一个指针放在数组的开头.然后递减结束指针,直到看到第一个非零元素.

现在主循环:

>如果开始指针指向零,则将其与指向的值交换
由指针结束;然后递减结束指针.
>始终递增开始指针.
>当开始指针变得大于或等于结束时完成
指针.

最后,返回开始指针的位置 – 即非零元素的数量.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐