- 多数元素
解法一: 遍历整个数组,然后用另一重循环统计每个数字出现的次数。将出现次数大于len/2的数字返回。
时间复杂度:O(n^2)
class Solution {
public int majorityElement(int[] nums) {
int majorityCount = nums.length/2;
for (int num : nums) {
int count = 0;
for (int elem : nums) {
if (elem == num) {
count ++;
}
}
if (count > majorityCount) {
return num;
}
}
return -1;
}
}
解法二: 如果所有数字被单调递增或者单调递减的顺序排了序,那么众数的下标为 n/2(偶数时为n/2+1)
时间复杂度:O(nlgn)
class Solution {
public int majorityElement(int[] nums) {
Arrays.sort(nums);
return nums[nums.length/2];
}
}
- 数组中的第K个最大元素
解法一: 直接使用库函数sort排序后输出len-k即可,时间复杂度:O(NlogN)
解法二: 快速排序的思想是每轮选中一个基准值,然后两个指针分别从头尾遍历直到相遇,在该轮结束时,将基准值调换到合适的位置,使他左边都比他小,右边都比他大。这道题显然可以利用这种思想,先将比基准值大的元素都分到数组的右边,看基准值的位置是否是len-k,大了就到前半再排,小了就到后半再排,直到相等。
这种情况下时间复杂度:O(以n为首项,1/2为公比的等比数列的和) = O(n)
需要注意的时,这种方法对于越混乱的越高效,如果面对最坏情况(已经有序排列),这种方法会达到 O(N^2),毫无意义。所以必须随机选择初始基准值。
import java.util.Random;
public class Solution {
private static Random random = new Random(System.currentTimeMillis());
public int findKthLargest(int[] nums, int k) {
int len = nums.length;
int left = 0