leetcode-448 找到所有数组中消失的数字 [Java]

类别:数组 统计数组中的元素

题目:

leetcode-448 找到所有数组中消失的数字 [Java]_第1张图片

法一:借助flag数组

想法:

初始化

        flag数组存出现的数

        resultList存结果(消失的数) 

遍历原数组

        将出现的对应存到flag中

        遍历flag数组,若为0(消失的数),则加入i+1到列表resultList中

代码:

class Solution { 

    public List findDisappearedNumbers(int[] nums) {

        int[] flag=new int[nums.length];

        int i=0;

        while(i resultList = new ArrayList();

        i=0;

        while(i

leetcode-448 找到所有数组中消失的数字 [Java]_第2张图片

法二:双循环变量

想法:

先对原数组进行排序

初始化

        i、j两个循环变量,i负责遍历,j表示元素遍历

        resultList存结果(消失的数) 

遍历原数组

        若nums[i]==j(即未消失),则若该元素未重复/为最后一个数字,则j++

        否则 存下此消失的数

                j++(查看下一个元素是否消失),i--重新判断这一位(可能连着消失好几个)

        遍历完成后 不要忘记 j~nums.length这些数(如有)也是消失的噢!

class Solution {

    public List findDisappearedNumbers(int[] nums) {

        int i=0;

        int j=1;

        Arrays.sort(nums);

        ArrayList resultList = new ArrayList();

        while(i

leetcode-448 找到所有数组中消失的数字 [Java]_第3张图片

本以为少开一个flag可以内存消耗少点 哈哈哈哈哈.... 

法三:原地修改(官方题解)

由于nums 的数字范围均在 [1,n]中,我们可以利用这一范围之外的数字,来表达「是否存在」

具体来说,遍历nums,每遇到一个数 x,就让 nums[x−1] 增加 n。由于nums 中所有数均在 [1,n]中,增加以后,这些数必然大于 n。最后我们遍历nums,若nums[i] 未大于 n,就说明没有遇到过数 i+1。这样我们就找到了缺失的数字。

class Solution {

    public List findDisappearedNumbers(int[] nums) {

        int n = nums.length;

        for (int num : nums) {

            int x = (num - 1) % n;

            nums[x] += n;

        }

        List ret = new ArrayList();

        for (int i = 0; i < n; i++) {

            if (nums[i] <= n) {

                ret.add(i + 1);

            }

        }

        return ret;

    }

}

leetcode-448 找到所有数组中消失的数字 [Java]_第4张图片

和法一没差多少 

你可能感兴趣的:(leetcode-Code,java,leetcode,算法)