169 - 229 - 274。
169. 多数元素
普通的想法就是用哈希表
T:O(n),S:O(m)
// 19.19
// 19.22
class Solution {
public:
int majorityElement(vector<int>& nums) {
unordered_map<int, int> m;
for(auto x : nums) {
if(++m[x] >= (nums.size()+1) / 2) return x;
}
return nums.front();
}
};
改进一下,因为是多数派,所以多数派出现的次数减去其他所以元素出现的次数必定大于0
T:O(n),S:O(1)
class Solution {
public:
int majorityElement(vector<int>& nums) {
int target = nums.front(), cnt = 1;
for(int i = 1; i < nums.size(); i++) {
if(target == nums[i]) cnt++;
else cnt--;
if(cnt == 0) {
cnt++;
target = nums[i];
}
}
return target;
}
};
229. 求众数 II
这是上一题的延申,也是投票法的扩展
图片来自 leetcode答案 作者:clearboy
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
if(nums.empty()) return {};
int a = 0, cnta = 0;
int b = 0, cntb = 0;
for(auto x : nums) {
if(x == a) cnta++;
else if(x == b) cntb++;
else {
if(!cnta) {
a = x;
cnta = 1;
} else if(!cntb) {
b = x;
cntb = 1;
} else {
cnta--;
cntb--;
}
}
}
cnta = cntb = 0;
for(auto x : nums) {
if(x == a) cnta++;
else if(x == b) cntb++;
}
vector<int> ans;
if(cnta > nums.size() / 3) ans.push_back(a);
if(cntb > nums.size() / 3) ans.push_back(b);
return ans;
}
};
274. H 指数
// 19.38
// 19.57
class Solution {
public:
int hIndex(vector<int>& citations) {
if(citations.empty()) return 0;
sort(citations.begin(), citations.end());
int ans = (citations[0])? 1 : 0;
for(int i = citations.size()-1; i >= 0; i--) {
if(citations[i] >= citations.size() - i)
ans = (ans > citations.size() - i)? ans : citations.size() - i;
}
return ans;
}
};