【力扣热题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;
    }
相关推荐
青山木7 小时前
Hot 100 ---腐烂的橘子
java·数据结构·后端·算法·leetcode·广度优先
未来之窗软件服务7 小时前
计算机考试-快速排序—东方仙盟
数据结构·算法·排序算法·仙盟创梦ide·东方仙盟
小龙报8 小时前
【优选算法】1. 水果成蓝 2.找到字符串中所有字母的异位词
java·c语言·数据结构·数据库·c++·redis·算法
一只小菜鸡..8 小时前
南京大学 操作系统 (JYY) 学习笔记:导论与历史的轮回 (OS Introduction)
笔记·学习
txzrxz8 小时前
数论:排列数、组合数、费马小定理、逆元、同余定理
c++·算法·数论·组合数·费马小定理·逆元·排列数
xqqxqxxq8 小时前
LeetCode Hot100 双指针专项题解笔记
笔记·算法·leetcode
懿路向前9 小时前
【HarmonyOS学习笔记】2026-07-24 | textProcessing 实体识别与踩坑实录
笔记·学习·边缘计算·harmonyos
闪电悠米9 小时前
力扣hot100-54.螺旋矩阵-模拟边界控制详解
算法·leetcode·矩阵
变量未定义~9 小时前
虚拟节点-星石传送阵(4星)、强连通分量
数据结构·算法
春生野草9 小时前
C基础--八大排序(个人笔记)
c语言·笔记·排序算法