美文网首页
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