找出数组中出现次数超过一半的数
方法有很多,我就用两种最直接的方法实现一下
方法一:比较法
最容易想到的办法当然是直接用比较法,因为是超过一半,所以最多只能有一个,如果有多于一个的话就矛盾了
时间复杂度O(N*N)
空间复杂度O(N)
public bool search(int nums[], int len, int & num) { int count;
int length = len / 2 + 1; for (int i = 0; i < len; ++ i) { count = 1; for (int j = i+1; j < len; ++ j) { if (nums[i] == nums[j]) { count ++; } if (count >= length) { num = nums[i]; return true; } } } return false; }
方法二:排序法(这种数要一定存在)
将数组按升序排序,假设有N个数,第(N/2+1)个数就是你要找的,这里顺便复习一下快排
时间复杂度为O(N log N)
空间复杂度O(N)
int sort(int * nums, int low, int up) { nums[0] = nums[low]; int k = nums[0]; while (low < up) { while (low < up && nums[low] >= k) { -- up; } nums[low] = nums[up]; while (low < up && nums[low] <= k) { ++ low; } nums[up] = nums[low]; } nums[low] = nums[0]; return low; } void qsort(int *nums, int low, int up) { if (low < up) { int loc = sort(nums, low, up); qsort(nums, low, loc - 1); qsort(nums, loc + 1, up); } } void search(int * nums, int len, int & num) { qsort(nums, 1, len); num = nums[len/2+1]; }