zoukankan      html  css  js  c++  java
  • 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;
        }
    }


  • 相关阅读:
    C#字符串的比较
    C#字符串分割
    [Android] Android 卡片式控件CardView的优雅使用
    [Android] Android Studio 使用config.gradle统一管理项目的依赖库
    [Android] Android Studio 修改Gradle使用国内源
    [Android] Sqlite 数据库操作 工具封装类
    [Android] Android 去掉界面标题栏的方法
    [Android] Android RecycleView和ListView 自定义Adapter封装类
    [Android] Android 让UI控件固定于底部的几种方法
    [Android] Android读取Asset下文件的最简单的方法总结(用于MediaPlayer中)
  • 原文地址:https://www.cnblogs.com/myfaith-feng/p/9576525.html
Copyright © 2011-2022 走看看