Leetcode Tags(2)Array

  一、448. Find All Numbers Disappeared in an Array

给定一个范围在  1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。
找到所有在 [1, n] 范围之间没有出现在数组中的数字。
您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。
输入:[4,3,2,7,8,2,3,1]
输出:[5,6]

  1.算法思路(本题关键点:注意数组下标的范围和要求的数之间有什么联系。

  既然要遍历[1,n]中的数,由于数组中的长度已经保证了为n,因此数组的下标加上1就正好满足从1到n,因此,要对下标做文章。

  2.代码实现

  将[4,3,2,7,8,2,3,1]变成[-4,-3,-2,-7,8,2,-3,-1]然后遍历到8和2这两个正数时,就将数组下标加上1就是要求的结果了。

    public List<Integer> findDisappearedNumbers(int[] nums) {
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < nums.length; i++) {
            int val = Math.abs(nums[i]) - 1;
            if (nums[val] > 0) nums[val] = -nums[val];// 如果不进行判断,那么2和3就会反转两次,还是变成2和3,最后结果为[2,3,5,6]
        }
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] > 0) list.add(i+1);
        }
        return list;
    }

  

  二、283. Move Zeroes

Input: [0,1,0,3,12]
Output: [1,3,12,0,0]

  1.算法思路:双指针,前一个指针指的是数组的索引,后一个指针指的是非零元素的索引

  2.代码实现

  (1)最普通的思路最清晰的双指针

    public void moveZeroes(int[] nums) {
        int prev = 0;
        int curr = 0;
        while (curr < nums.length) {
            if (nums[prev] == 0 && nums[curr] != 0) {
                nums[prev] = nums[curr];
                nums[curr] = 0;
                prev++;
                curr++;
            } else if (nums[prev] != 0 && nums[curr] == 0) {
                prev++;
                curr++;
            } else if (nums[prev] != 0 && nums[curr] != 0) {
                prev++;
                curr++;
            } else {
                curr++;
            }
        }
    }
Low Code

  (2)高级的双指针写法1,(关键点:nums[lastNonZeroFoundAt++]的写法)同样使用指针lastNonZeroFoundAt和指针i。

void moveZeroes(vector<int>& nums) {
    int lastNonZeroFoundAt = 0;
    for (int i = 0; i < nums.size(); i++) {
        if (nums[i] != 0) nums[lastNonZeroFoundAt++] = nums[i];    
    }
    for (int i = lastNonZeroFoundAt; i < nums.size(); i++) nums[i] = 0;
}

  (3)高级的双指针写法2

void moveZeroes(vector<int>& nums) {
    for (int lastNonZeroFoundAt = 0, cur = 0; cur < nums.size(); cur++) {
        if (nums[cur] != 0) swap(nums[lastNonZeroFoundAt++], nums[cur]);
    }
}

  三、

猜你喜欢

转载自www.cnblogs.com/BigJunOba/p/9568728.html