【力扣热题100】[Java版] 刷题笔记-448. 找到所有数组中消失的数字

题目:448. 找到所有数组中消失的数字

给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。

解题思路

依据题目,有两种解题方式:

第一种是暴力破解,直接创建一个1到n的数组,与传入的数组对比,利用数组自带的函数,得出数组中消失的数字;(数组长度很长时,会超时)

第二种:在数据中判断数字是否为正确位置,如果是,则不需要修正,如果不是,则与正确位置的数字进行交换,直到遍历完所有数据;再进行第二次遍历新的数组,记录位置不正确的数字。

第三种:是看的其他人的解法,很巧妙,整体也是遍历两次数组,第一次遍历,通过数组的数字 x ,判断 x-1 是否有数字且数字大于1, 则将该位置数字 *-1 并赋值给 x-1 位置,这里乘 -1是进行标记,表示数字存在;第二次遍历新数据,数组中大于0的数字存入结果,即是数组中没有的数字。

解题过程

第一种:

java 复制代码
class Solution {
    // 数组长度很大时会超时
    public List<Integer> findDisappearedNumbers(int[] nums) {
        List<Integer> a = new ArrayList<>();
        for (int i = 0; i < nums.length; i++) {
            a.add(i + 1);
        }
        for (int j = 0; j < nums.length; j++) {
            a.remove(Integer.valueOf(nums[j]));
        }
        return a;
    }  

}

第二种:

java 复制代码
class Solution {
   
    public List<Integer> findDisappearedNumbers(int[] nums) {
        List<Integer> res = new ArrayList<>();
        int n = nums.length;
        // 交换位置,如果位置正确 或者数值与对应的位置数值相同,则不需要交换
        int i = 0;
        while (i < n) {
            if (nums[i] == i + 1) {
                i++;
                continue;
            }
            int index = nums[i] - 1;
            if (nums[i] == nums[index]) {
                i++;
                continue;
            }
            // 交换位置
            int temp = nums[i];
            nums[i] = nums[index];
            nums[index] = temp;
        }

        for (int j = 0; j < nums.length; j++) {
            if (nums[j] != j + 1) {
                res.add(j + 1);
            }
        }
        return res;
    }
}

第三种:

java 复制代码
public List<Integer> findDisappearedNumbers(int[] nums) {
        List<Integer> res = new ArrayList<>();
        int n = nums.length;
        for (int i = 0; i < n; i++) {
            // 获取当前值,如果当前值作为索引(值-1)存在对应的值,则赋予负值
            int num = Math.abs(nums[i]);
            int index = num - 1;
            if (nums[index] > 0) {
                nums[index] *= -1;
            }
        }
        for (int j = 0; j < nums.length; j++) {
            if (nums[j] > 0) {
                res.add(j + 1);
            }
        }
        return res;
    }
相关推荐
扫地的小何尚4 分钟前
NVIDIA RTX PC开源AI工具升级:加速LLM和扩散模型的性能革命
人工智能·python·算法·开源·nvidia·1024程序员节
千金裘换酒1 小时前
LeetCode反转链表
算法·leetcode·链表
李派森1 小时前
软考高项(信息系统项目管理师)—第4章 信息系统管理全解析
笔记·计算机网络
byzh_rc2 小时前
[认知计算] 专栏总结
线性代数·算法·matlab·信号处理
qq_433554542 小时前
C++ manacher(求解回文串问题)
开发语言·c++·算法
歌_顿2 小时前
知识蒸馏学习总结
人工智能·算法
浩瀚地学2 小时前
【Java】常用API(二)
java·开发语言·经验分享·笔记·学习
圣保罗的大教堂3 小时前
leetcode 1161. 最大层内元素和 中等
leetcode
闲看云起3 小时前
LeetCode-day6:接雨水
算法·leetcode·职场和发展
没学上了3 小时前
VLM_一维离散卷积与二维离散卷积(还是复习感觉还行)
算法