【力扣热题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;
    }
相关推荐
_李小白11 分钟前
【OSG学习笔记】Day 53: Text3D( 三维文字)
笔记·学习·3d
睡一觉就好了。24 分钟前
哈希表(一)
算法·散列表
輕華25 分钟前
Word2Vec与CBOW算法实战:从词向量到上下文感知
人工智能·算法·word2vec
Matlab程序猿小助手26 分钟前
【MATLAB源码-第315期】基于matlab的䲟鱼优化算法(ROA)无人机三维路径规划,输出做短路径图和适应度曲线.
开发语言·算法·matlab
圣保罗的大教堂34 分钟前
leetcode 874. 模拟行走机器人 中等
leetcode
Oll Correct34 分钟前
实验十七:验证路由器既隔离碰撞域也隔离广播域
网络·笔记
zhangrelay1 小时前
智能时代机器人工程师・云原生 + 大模型 + 智能体 全栈成长计划(2026 版)
笔记·学习
luoganttcc1 小时前
CUDA grid/block 到矩阵映射示例(矩阵加法)
人工智能·算法·机器学习
YuanDaima20481 小时前
Python 数据结构与语法速查笔记
开发语言·数据结构·人工智能·python·算法
XY_墨莲伊1 小时前
【编译原理】实验一:基于正则文法的词法分析器设计与实现
开发语言·数据结构·算法