Majority Element II (M)
題目
Given an integer array of size n, find all elements that appear more than ? n/3 ? times.
Note: The algorithm should run in linear time and in O(1) space.
Example 1:
Input: [3,2,3]
Output: [3]
Example 2:
Input: [1,1,1,3,3,2,2,2]
Output: [1,2]
題意
找到陣列中所有出現次數大于? n/3 ?的元素,
思路
限制時間為O(N)、空間為O(1),因此不能用Hash或者排序,使用 169. Majority Element (E) 中提到的摩爾投票法 Boyer-Moore Majority Vote,求所有出現次數大于? n/3 ?的元素,用反證法很容易證明這種元素最多只有兩個,所以可以先用摩爾投票法獲得兩個候選元素,再重新遍歷陣列統計候選元素出現的次數,將滿足條件的加入到結果集中,
代碼實作
Java
class Solution {
public List<Integer> majorityElement(int[] nums) {
List<Integer> ans = new ArrayList<>();
int a = 0, b = 0;
int countA = 0, countB = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == a) {
countA++;
} else if (nums[i] == b) {
countB++;
} else if (countA == 0) {
a = nums[i];
countA = 1;
} else if (countB == 0) {
b = nums[i];
countB = 1;
} else {
countA--;
countB--;
}
}
countA = 0;
countB = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == a) {
countA++;
} else if (nums[i] == b) {
countB++;
}
}
if (countA > nums.length / 3) {
ans.add(a);
}
if (countB > nums.length / 3) {
ans.add(b);
}
return ans;
}
}
JavaScript
/**
* @param {number[]} nums
* @return {number[]}
*/
var majorityElement = function (nums) {
let ans = []
let a = 0, b = 0, countA = 0, countB = 0
for (let num of nums) {
if (num === a) {
countA++
} else if (num === b) {
countB++
} else if (countA === 0) {
a = num
countA = 1
} else if (countB === 0) {
b = num
countB = 1
} else {
countA--
countB--
}
}
countA = 0, countB = 0
for (let num of nums) {
if (num === a) {
countA++
} else if (num === b) {
countB++
}
}
if (countA > Math.trunc(nums.length / 3)) ans.push(a)
if (countB > Math.trunc(nums.length / 3)) ans.push(b)
return ans
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/107679.html
標籤:其他
上一篇:【CTF】WDCTF-2017 3-1 writeup
下一篇:新人報道貼
