leetcode的每天一题更新(find all numbers

2017-04-18  本文已影响0人  今天是晴天

题目:给一个数组,里面的数字是从1到数组长度的数组,有重复,找出那些属于1到数组长度的没有出现在数组里的数。
解题思路:先将数组排序,先分两种情况,如果nums[0]大于1,则循环加入从2到nums[0]-1的数字,如果nums[nums.length-1]大于nums.length,则循环加入之间的数字,中间的,如果num[i]!=nums[i+1]+1,则循环加入之间的数字,这算是笨办法,写完以后accepted。等会看答案顺便更新厉害的解决办法,我的代码:

public class Solution {
    public List<Integer> findDisappearedNumbers(int[] nums) {
        Arrays.sort(nums);
        int interval=0;
        List<Integer> result=new ArrayList<Integer>();
        for(int i=0;i<nums.length-1;i++){  
            if(i==nums.length-2 && nums[i+1]<nums.length){
                for(int j=nums[i+1]+1;j<=nums.length;j++)result.add(j); 
            }
            if(nums[i]!=nums[i+1]+1){
                for(int j=nums[i]+1;j<nums[i+1];j++)result.add(j); 
            }
            if(nums[i]>1 && i==0){
                for(int j=1;j<nums[0];j++)result.add(j); 
            }
        }
        return result;
    }
}

看了一会厉害的代码,这个题目应该是没什么取巧的方法,那个人的代码意思是循环一边将nums里的数字只要出现过的就将这个数字对应的数组里的位置数字置为负数,循环第二遍的时候将数字不是负数的数组下标+1添加到List里面,代码:

    public List<Integer> findDisappearedNumbers(int[] nums) {
        List<Integer> ret = new ArrayList<Integer>();
        
        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) {
                ret.add(i+1);
            }
        }
        return ret;
    }

上一篇下一篇

猜你喜欢

热点阅读