LEETCODE (5/31)(Java)

菜鸟起航。

题目(LeetCode No.217)

for循环遍历

初看极为简单,不动脑就会去选择两次for循环遍历对比。

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;
    }
}

O(n^2)的时间复杂度,着实是选择了一个最笨拙的解法。

初步的优化将整个数组排序之后再开始对比,由于无论是时间复杂度O(nlogn)的快排还是其他O(n)级别的排序算法,之后用一个for循环对i和i+1进行比较,O(n)+O(n)或者O(nlogn)+O(n)相对于一开始的O(n^2)都快了许多。

使用HashSet

还有一种思路是使用HashSet,效率相较于排序后比较的方式低。

class Solution {
    public boolean containsDuplicate(int[] nums) {
        Set<Integer> set = new HashSet<>();
        for (int i : nums) {
            if (set.contains(i)) return true;
            set.add(i);
        }
        return false;   
    }
}

位运算

其实还看到了一种方式,是通过位运算来判重,速度很快。

但是事实上这种方式在本题有局限性,不能够满足所有情况。

class Solution {
    public boolean containsDuplicate(int[] nums) {
       if (nums.length < 1 || nums[0] == 237384 || nums[0] == -24500)
			return false;
		boolean[] bs = new boolean[1024];
		for (int n : nums)
			if (bs[n & 1023])
				return true;
			else
				bs[n & 1023] = true;
		
		return false;
    }
}