LeetCode(一) —— 存在重复

给定一个整数数组,判断是否存在重复元素。

如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。

示例 1:

输入: [1,2,3,1]
输出: true

示例 2:

输入: [1,2,3,4]
输出: false

示例 3:

输入: [1,1,1,3,3,4,3,2,4,2]
输出: true

此题的解题思路:数学中的一种文字游戏,任何值存在至少两次,反过来推敲就是只要每个元素都不相同就判断为false,否则就为true,抓住这个要点就可以把题解出来,但是要将代码的执行速度提高,就不能按常理去暴力循环遍历破解

效率破解方法一:利用Java中的Arrays.sort(数组);将数组进行排序,然后一次逐个遍历比较是否相等,相等就返回true,否则返回false。这个是大致思路,比上面的常规思路要快上n倍,但是还能够简化,在排序前进行数组长度判断
如果数组长度小于等于1就返回false,然后第二优化是逐个遍历中的比较,nums[i]==nums[i-1]的效率要比num[i-1]==nums[i]高,高上大约3ms左右。
效率破解方法二:利用Java中的HashSet的set特点,就是元素不能够重复,将数组的元素逐个放入到set中,然后比较两者的长度是否相等,如果不想等就表示拥有重复元素
效率破解方法三:此方法效率最高,但是也是最难懂的,逻辑最复杂的一个方法,大部分人通常遍历都是从0开始跟每个元素逐个比较,此时第一次遍历的时候遍历长度为nums.length,而本方法反过来使用,极大减少运行成本
代码:
方法一
class Solution {
    public boolean containsDuplicate(int[] nums) {
        for(int i=0;i<nums.length-1;i++){
            for(int j=i+1;j<nums.length;j++){
                if(nums[i]==nums[j]){
                    return true;
                }
            }
        }
        return false;
    }
}
方法二
class Solution {
    public boolean containsDuplicate(int[] nums) {
        if(nums.length<=1){
            return false;
        }
        HashSet<Integer> numset = new HashSet<Integer>();
        numset.add(nums[0]);
        for(int i = 1;i<nums.length;i++){
            numset.add(nums[i]);
            if(numset.size() < i+1){
                return true;
            }
        }
        return false;
    }
}
方法三
class Solution {
    public boolean containsDuplicate(int[] nums) {
        for (int i = 1; i < nums.length; i++) {
          for (int j = i - 1; j >= 0; j--) {
              if(nums[i] > nums[j])
              {
                  break;
              }
              else if(nums[i] == nums[j])
              {
                  return true;
              }
          }

      }
      return false;
    }
}


原文地址:https://www.cnblogs.com/myfaith-feng/p/9576525.html