美文网首页
LeetCode 第 442 题:数组中重复的数据

LeetCode 第 442 题:数组中重复的数据

作者: 放开那个BUG | 来源:发表于2022-05-09 22:29 被阅读0次

1、前言

题目描述

2、思路

采用桶排序的思路,只不过桶排序需要开辟新数组,而题目中的原数组就是长度为 n,且数组中数字是 1-n,说明可以将原数组原地桶排序。

采用遍历两边的思路,第一遍将 nums[i] != nums[nums[i] - 1] 的数交换;第二遍如果 i != nums[i] - 1 则说明它无处安放,直接选它即可。如果是一遍的话,那交换过程中可能会选到重复的,只能修改原来数字或者用 set,不推荐。

3、代码

class Solution {
    public List<Integer> findDuplicates(int[] nums) {
        if(nums == null || nums.length == 0){
            return new ArrayList<>();
        }
        List<Integer> list = new ArrayList<>();
        for(int i = 0; i < nums.length; i++){
            while(nums[i] != nums[nums[i] - 1]){
                swap(nums, i, nums[i] - 1);
            }
//            // 这种会出现重复的,所以要在外边,要不然只能用 set
//            if(i != nums[i] - 1 && nums[i] == nums[nums[i] - 1]){
//                list.add(nums[i]);
//            }
        }
        for(int i = 0; i < nums.length; i++){
            if(i != nums[i] - 1 && nums[i] == nums[nums[i] - 1]){
                list.add(nums[i]);
            }
        }
        return list;
    }

    private void swap(int[] nums, int i, int j){
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

相关文章

网友评论

      本文标题:LeetCode 第 442 题:数组中重复的数据

      本文链接:https://www.haomeiwen.com/subject/jbskurtx.html