暴力法:
class Solution { public int majorityElement(int[] nums) { //最容易想到暴力法 int n = nums.length; if(n==1) return nums[0]; Map<Integer,Integer> map = new HashMap<>(); for (int num : nums) { if (map.containsKey(num)) { int x = map.get(num); if (x == n / 2) return num; map.put(num, x + 1); } else { map.put(num, 1); } } return -1; } }
方法二:先排序
class Solution { public int majorityElement(int[] nums) { //先对数组进行排序 Arrays.sort(nums); int count = 1; int i = 1; int n = nums.length; if(n == 1) return nums[0]; while(i<n){ if(nums[i] == nums[i-1]) { if (count == n / 2) return nums[i]; else { count++; i++; } }else{ i++; count = 1; } } return -1; } }
方法三:双指针
class Solution { public int majorityElement(int[] nums) { Arrays.sort(nums); //双指针 int i = 0,j=1; int n = nums.length; if(n == 1) return nums[0]; while(j<n){ if(nums[j] == nums[i]){ j++; }else{ if(j-i>n/2) return nums[j-1]; i = j; j++; } } return nums[j-1]; } }
方法4:
public int majorityElement(int[] nums) { Arrays.sort(nums); return nums[nums.length/2]; }
快速排序,,,
class Solution { public int majorityElement(int[] nums) { int n = nums.length; sort(nums,0,n-1); int mid = n/2; return nums[mid]; } private void sort(int[] nums, int start, int end) { int left = start-1; int right = end+1; int p = start; int num = nums[(left+right)/2]; while(p<right){ if(nums[p]<num){ swap(p++,++left,nums); }else if(nums[p]>num){ swap(p,--right,nums); }else p++; } if(left>start) sort(nums,start,left); if(right<end) sort(nums,right,end); } private void swap(int i, int small, int[] nums) { int temp = nums[i]; nums[i] = nums[small]; nums[small] = temp; } }