Missing Number 类,元素交换,数组环形跳转
Missing Number 类,元素交换,数组环形跳转
一次 swap = 2次数组写入 + 1次 temp variable 写入,总写入次数为 O(3n),总数组写入次数为 O(2n).
public class Solution {
public void moveZeroes(int[] nums) {
if(nums == null || nums.length == 0) return;
int ptr = 0;
while(ptr < nums.length && nums[ptr] != 0) ptr ++;
for(int i = ptr + 1; i < nums.length; i++){
if(nums[i] != 0) swap(nums, i, ptr++);
}
}
private void swap(int[] nums, int a, int b){
int temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
}
}这种写法中,数组每一个位置一定会被不多不少写入一次,写入次数为 O(n)
思路就是不断试图把当前元素替换到其正确的位置上;如果目标位置元素已经正确则 do nothing,如果目标位置越界,也 do nothing. 每次交换之后指针位置不动,继续试图新一轮替换。这样一次循环之后,所有能被放到正确位置的元素,都会被放过去,而第一个位置和值不匹配的元素就是我们要寻找的目标。
注意要点:
这题的要点在于 “不断更新 lower”,并且根据个新元素带来的区间终点决定是添加一个元素,还是一个区间。
好吧,写完了我才发现不让修改原数组= =
这里要注意初始化问题,fast 要初始化成 nums[nums[0]],不然死循环。
(G面经)
跳转序列可以拆成几个独立的环,同时也知道每个环的长度,然后求所有环长度的最小公倍数?比如[1,0,4,2,3]就是0-1-0 和 2-3-4-2两个环,所以6次shuffle后变回原来的数组
Least common multiple = 最小公倍数
Last updated