• 217. Contains Duplicate


    一、题目

      1、审题

      

      2、分析

        判断一个数组中是否有重复的元素

    二、解答

      1、思路:

        方法一、

          先排序,在判断

    1     public boolean containsDuplicate(int[] nums) {
    2         
    3         Arrays.sort(nums);
    4         for (int i = 1; i < nums.length; i++) {
    5             if(nums[i] == nums[i - 1])
    6                 return true;
    7         }
    8         return false;
    9     }

        方法二、

          使用优先队列 PriorityQueue 对数组进行排序

     1     public boolean containsDuplicate2(int[] nums) {
     2         
     3         PriorityQueue<Integer> queue = new PriorityQueue<>();
     4         for(int i: nums)
     5             queue.offer(i);
     6         int tmp = -1;
     7         while(!queue.isEmpty()) {
     8             int cur = queue.poll();
     9             if(cur == tmp)
    10                 return true;
    11             tmp = cur;
    12         }
    13         return false;
    14     }

        方法三、

          使用选择排序对数组进行排序,在判断。

          注意: 为了提高选择排序的效率(即避免基本有序时的最坏情况),可以先对数组元素进行乱序。

     1     public boolean containsDuplicate3(int[] nums) {
     2         
     3         shuffle(nums);
     4         int low = 0, high = nums.length - 1;
     5         selectionSort(nums, low, high);
     6         for (int i = 1; i < nums.length; i++) {
     7             if(nums[i] == nums[i - 1])
     8                 return true;
     9         }
    10         return false;
    11     }
    12     
    13     private void shuffle(int[] nums) {
    14         Random random = new Random();
    15         for (int i = 1; i < nums.length; i++) {
    16             int r = random.nextInt(i + 1);
    17             exchange(nums, i, r);
    18         }
    19     }
    20 
    21     private void selectionSort(int[] nums, int low, int high) {
    22         
    23         if(low >= high)
    24             return;
    25         int i = low, j = high + 1;
    26         while(i < j) {
    27             while((i + 1 <= high) && nums[++i] < nums[low]);    // 从左向右找比 low 大的
    28             while((j - 1 >= low) && nums[low] < nums[--j]);    // 从右向左找比 low 小的
    29             if(i < j)
    30                 exchange(nums, i, j);
    31             else
    32                 break;
    33         }
    34         exchange(nums, low, j);
    35         selectionSort(nums, low, j - 1);
    36         selectionSort(nums, j + 1, high);
    37     }
    38     private void exchange(int[] nums, int i, int j) {
    39         int tmp = nums[i];
    40         nums[i] = nums[j];
    41         nums[j] = tmp;
    42     }

          

      

  • 相关阅读:
    hadoop 2.6.0 LightWeightGSet源码分析
    推断扫描后的内容是否是URL
    Merge Sorted Array
    带条件的分页【重点】
    第8章2节《MonkeyRunner源代码剖析》MonkeyRunner启动执行过程-解析处理命令行參数
    php持续集成环境笔记
    hdu5137 How Many Maos Does the Guanxi Worth(单源最短路径)
    求最长公共子序列
    集团公司(嵌入ETL工具)財务报表系统解决方式
    ADT+NDK搭建jni编译环境
  • 原文地址:https://www.cnblogs.com/skillking/p/9902157.html
Copyright © 2020-2023  润新知