LeetCode#448. Find All Numbers Disappeared in an Array LeetCode#442. Find All Duplicates in an Array

来源:互联网 发布:知其雄守其雌 曾国藩 编辑:程序博客网 时间:2024/05/17 07:45

LeetCode#448

  • 题目:一个大小为n的数组,数组中的元素都在1到n之间,有元素可能出现多次,找出没有出现在数组中的元素(除返回结果,不能申请额外的空间,时间复杂度要求为o(n))
  • 难度:Easy
  • 思路:由于时间复杂度和空间复杂度的限制,我们需要在原数组中进行一些操作,来标志那些值已经存在,将数组元素和数组下表关系利用起来,标志元素是否存在(这里是将nums[i]-1作为下标,第一遍for循环,将数组元素nums[nums[i]-1]赋值为0或者负数)
  • 代码:
public class Solution {    public List<Integer> findDisappearedNumbers(int[] nums) {        List<Integer> result = new ArrayList<>();        if(nums == null || nums.length == 0){            return result;        }        for(int i = 0; i < nums.length; i++){            int val = Math.abs(nums[i]) - 1;            if(nums[val] > 0){                nums[val] = -nums[val];            }        }        for(int i = 0; i < nums.length; i++){            if(nums[i] > 0){                result.add(i+1);            }        }        return result;    }}

LeetCode#442

  • 题目:一个大小为n的数组,数组所有元素都是1-n之间的值,一部分元素在数组中出现一次,一部分元素在数组中出现两次,找出所有出现两次的元素返回
  • 难度:Medium(做出上一道题,这道题其实就简单了)
  • 思路:同上一道题,只要稍微改变一下判断条件
  • 代码:
public class Solution {    public List<Integer> findDuplicates(int[] nums) {        List<Integer> result = new ArrayList<>();        if(nums == null || nums.length == 0){            return result;        }        for(int i = 0; i < nums.length; i++){            int val = Math.abs(nums[i]) - 1;            if(nums[val] < 0){                result.add(val+1);            }else{                nums[val] = - nums[val];            }        }        return result;    }}
阅读全文
0 0