标签:ash 暴力 执行 题解 遍历 als 函数返回 数组 duplicate
给定一个整数数组,判断是否存在重复元素。
如果任何值在数组中出现至少两次,函数返回 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; } }
标签:ash 暴力 执行 题解 遍历 als 函数返回 数组 duplicate
原文地址:https://www.cnblogs.com/myfaith-feng/p/9576525.html