题目一:
给定一个大小为 n
的数组 nums
,返回其中的多数元素。多数元素是指在数组中出现次数 大于
⌊ n/2 ⌋
的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:nums = [3,2,3] 输出:3
示例 2:
输入:nums = [2,2,1,1,1,2,2] 输出:2
1、哈希表(解法1)
把每一个数字都创建一个哈希选项
#include <unordered_map>
class Solution {
public:
int majorityElement(vector<int>& nums) {
unordered_map<int, int> hashTable;
for(int i=0;i<nums.size();i++){
if (hashTable.find(nums[i]) != hashTable.end()) {
hashTable[nums[i]] =hashTable[nums[i]] + 1;
} else {
hashTable[nums[i]] = 1;
}
}
int max1=1;
int num=1;
for (const auto &pair : hashTable) {
if(pair.second>=max1){
max1 = pair.second;
num = pair.first;
}
}
return num;
}
};
1、排序法(解法2)
题目二:
轮转数组
给定一个整数数组 nums
,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。
示例 1:
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
1、借助额外空间(解法一)
class Solution {
public:
void rotate(vector<int>& nums, int k) {
vector<int>nums1;
int all = nums.size();
int a = k % all;
int front_last = all-a;
for(int i = front_last; i<all;i++){
nums1.push_back(nums[i]);
}
for(int i = 0;i<front_last;i++){
nums1.push_back(nums[i]);
}
nums.clear();
for(int i = 0;i<all;i++){
nums.push_back(nums1[i]);
}
}
};
2、翻转法(解法二)很通用
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
k = k % n; // 若 k 大于数组长度,取 k 对数组长度的余数
// 第一步:翻转整个数组
reverse(nums.begin(), nums.end());
// 第二步:翻转前 k 个元素
reverse(nums.begin(), nums.begin() + k);
// 第三步:翻转剩余的元素
reverse(nums.begin() + k, nums.end());
}
};