给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/majority-element
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1.拿到题目后第一反应是借助一个hash表来进行记录,但是空间复杂度会变为O(n),不符合题意。代码如下:
public int singleNumber(int[] nums) { HashMap<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { if (map.containsKey(nums[i])){ map.put(nums[i],map.get(nums[i])+1); }else{ map.put(nums[i],1); } } for (Integer integer : map.keySet()) { int count = map.get(integer); if (count == 1){ return integer; } } return -1; }
2.由于上一个解法使用hash导致空间复杂度提高,所以随后想到使用排序算法进行解题,但是使用快排的时间复杂度也达到了O(nlogn),所以放弃。
public int singleNumber(int[] nums) { Arrays.sort(nums); int result = 0; if(nums.length == 1){ return nums[0]; } if (nums[0] != nums[1]){ return nums[0]; } for (int i = 1; i < nums.length; i++) { if (i== nums.length-1){ if (nums[nums.length-1] != nums[nums.length-2]){ return nums[nums.length-1]; } break; } if (nums[i] == nums[i+1] || nums[i-1] == nums[i]){ }else{ result = nums[i]; } } return result; }
3.由于本人能力不足,想到这里就到头了,所以就默默的打开了题解,看到了一种异或操作来解这题,异或操作是属于相同为0,不同为1的运算,所以刚好用来解这题。
public int singleNumber(int[] nums) { int result = nums[0]; if (nums.length > 1){ for (int i = 1; i < nums.length ; i++) { result = result ^ nums[i]; } } return result; }
4.还有一种解法,暴力解法,这个解法就不做解释了,就是将一个元素拿出来对数组剩下的元素做对比,时间复杂度达到了O(n平方)。