给大家推荐leetcode网站进行算法刷题:
中文网站:https://leetcode-cn.com
国际网站:https://leetcode-cn.com
建议先在中文网站上刷题,中文网看完去国际网看下国际上大牛的解题思路。
Array(数组)
直接上实战题目:
移动零:
题目描述
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
例子:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
解决方法:
双指针法(中文网推荐解法):
思路:
使用两个指针(开始都在下标为0的位置),分别代表着非0和0的数量,第一个指针的左边代表着被处理好的数据,第二个指针进行数据处理,从下标0的位置开始判断数组里面的元素,如果为非0就跟第一个指针的元素进行替换位置。
结果你会发现:
左指针左边均为非零数;
右指针左边直到左指针处均为零。
每次交换,都是将左指针的零与右指针的非零数交换(说到底就是0元素和非0替换)
以下为答题:
时间复杂度为O(n)
2.把非0的往前挪,后面补零
这个方法精妙在于不需要交换位置,直接遍历数组,发现非0的直接往前挪,最后剩余位置补零。
第二种方法比较省时间,在leetcode提交结果: