【力扣热题100】[Java版] 刷题笔记-448. 找到所有数组中消失的数字
题目:448. 找到所有数组中消失的数字
给你一个含
n
个整数的数组nums
,其中nums[i]
在区间[1, n]
内。请你找出所有在[1, n]
范围内但没有出现在nums
中的数字,并以数组的形式返回结果。
解题思路
依据题目,有两种解题方式:
第一种是暴力破解,直接创建一个1到n的数组,与传入的数组对比,利用数组自带的函数,得出数组中消失的数字;(数组长度很长时,会超时)
第二种:在数据中判断数字是否为正确位置,如果是,则不需要修正,如果不是,则与正确位置的数字进行交换,直到遍历完所有数据;再进行第二次遍历新的数组,记录位置不正确的数字。
第三种:是看的其他人的解法,很巧妙,整体也是遍历两次数组,第一次遍历,通过数组的数字 x ,判断 x-1 是否有数字且数字大于1, 则将该位置数字 *-1 并赋值给 x-1 位置,这里乘 -1是进行标记,表示数字存在;第二次遍历新数据,数组中大于0的数字存入结果,即是数组中没有的数字。
解题过程
第一种:
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;
}
}
第二种:
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;
}
}
第三种:
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;
}
原文地址:https://blog.csdn.net/qq_26818839/article/details/144039566
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!