- 算法
- 1.多数投票算法
- 2.出现次数超过一半的数字则超过其他所有数字出现次数之和
- 3.保存两个变量,result和times,遍历数组
- 如果当前数字等于result,times加一
- 如果当前数字不等于result,且times不等于0,times减一
- 如果当前数字不等于result,且times等于0,置result为当前数字,times为1
public int majorityElement(int[] nums) {
// checkArguments(nums);
int result = nums[0];
int times = 1;
for (int i = 1; i < nums.length; i++) {
if (nums[i] == result) {
times++;
} else {
if (times > 0) {
times--;
} else {
result = nums[i];
times = 1;
}
}
}
return result;
} - 算法
- 1.快速排序算法
- 2.出现次数超过一半的数字排序后一定位于mid位置
- 3.使用快排的partition迭代寻找mid位置的数字
public int majorityElement(int[] nums) {
// checkArguments(nums);
int start = 0, end = nums.length - 1, mid = nums.length >> 1;
int index = partition(nums, start, end);
while (index != mid) {
if (index > mid) {
end = index - 1;
} else {
start = index + 1;
}
index = partition(nums, start, end);
}
return nums[index];
}
private int partition(int[] nums, int start, int end) {
int index = new Random().nextInt(end-start+1) + start;
swap(nums, end, index);
int small = start - 1;
for (index = start; index < end; index++) {
if (nums[index] < nums[end]) {
small++;
if (small != index) {
swap(nums, small, index);
}
}
}
swap(nums, ++small, end);
return small;
}
private void swap(int[] nums, int start, int end) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
}