Leetcode——数组中重复的数据(出现两次)

1. 数组中重复的数据

Leetcode——数组中重复的数据(出现两次)_第1张图片

(1)暴力排序

class Solution {
    
    public List<Integer> findDuplicates(int[] nums) {
        List<Integer> res = new ArrayList<>();
        Arrays.sort(nums);
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] == nums[i - 1]) {
                res.add(nums[i]);
            }
        }
        return res;
    }
}

(2)原地Hash

  • “桶排序”的思想是“抽屉原理”,即“一个萝卜一个坑”,8 个萝卜要放在 7 个坑里,则至少有 1 个坑里至少有 2 个萝卜。
  • 如果数组长度n小于数组最大值的时候处出现越界错误,而题目并没有指明数组长度和数组最大值一定相等。(题目指明了 n为数组长度且 1<=a[i]<=n)
class Solution {
    public List<Integer> findDuplicates(int[] nums) {
        // 记录结果
        List<Integer> res = new ArrayList<>();
        
        int len = nums.length;
        
        // 特判
        if (len == 0){
            return res;
        }

        // 对数组自己做哈希:数值为i的数字映射到下标 i - 1的位置
        for (int i = 0; i < len; i++) {
            // while循环将当前i位置的值,映射到下标 i - 1的位置
            //如果当前i的值已经与映射到下标 i - 1的位置的值相等,说明这两个值重复出现了两次,跳出当前while循环
            while (nums[nums[i] - 1] != nums[i]){
                swap(nums,i,nums[i] - 1);
            }
        }

        // 遍历交换后的数组,如果当前下标和数字不对应
        // 说明出现了重复的数字,加入到res中
        for (int i = 0; i < len; i++) {
            if (nums[i] - 1 != i){
                res.add(nums[i]);
            }
        }
        
        return res;
    }

    
    // 交换函数
    private void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

(3)直接排查

  • 找到数字i时,将位置i-1处的数字翻转为负数。
  • 如果位置i-1 上的数字已经为负,则i是出现两次的数字。
  • 如果数组长度n小于数组最大值的时候处出现越界错误,而题目并没有指明数组长度和数组最大值一定相等。(题目指明了 n为数组长度且 1<=a[i]<=n)
class Solution {
    
    public List<Integer> findDuplicates(int[] nums) {
        List<Integer> res = new ArrayList<>();
        for (int i = 0; i < nums.length; ++i) {
        	//必须取绝对值,因为中途可能被标记负数了
            int index = Math.abs(nums[i]) - 1;
            if (nums[index] < 0)
                res.add(Math.abs(index + 1));
            nums[index] = - nums[index];
        }
        return res;
    }
}

你可能感兴趣的:(LeetCode,leetcode,算法)