杂题
169.多数元素

方法一:哈希表
时间复杂度O(n),空间复杂度O(n)
class Solution {
public:
int majorityElement(vector<int>& nums) {
map<int,int>mp;
int ans=0;
for(int i=0;i<nums.size();i++){
mp[nums[i]]++;
}
for(auto i:mp){
if(i.second>(nums.size())/2){
ans= i.first;
break;
}
}
return ans;
}
};
方法二:投票法(空间复杂度O(1))
class Solution {
public:
int majorityElement(vector<int>& nums) {
// 投票法
/*candidate表示参与者,count表示投票数,如果和candidate一样就count++,
如果不一样就考虑是否票数-1且-1后是否为负如果为负说明当前candidate要修改改为当前数并且count设为1(仅有当前数)
*/
int candidate = -1; // candidate初始值任意
int count = 0;
for (auto i : nums) {
if (candidate == i) {
count++;
} else if (
--count <
0) { // 记录的candidate和当前数字不同那么当前candidate的票数count--,减后如果小于0说明这个candidate不是众数(就不是答案)
candidate = i;
count = 1; // 当前元素换为candidate,并将当前票数置为1
}
}
return candidate;
}
};
136.只出现一次的数字

方法:异或运算
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ans=0;
for(int i:nums){
ans=ans^i;
}
return ans;
}
};
75.颜色分类

class Solution {
public:
//单指针 荷兰国旗问题
void sortColors(vector<int>& nums) {
int ptr=0;
//先放0
for(int i=0;i<nums.size();i++){
if(nums[i]==0){
swap(nums[i],nums[ptr]);
ptr++;
}
}
//再放1
for(int i=0;i<nums.size();i++){
if(nums[i]==1){
swap(nums[i],nums[ptr]);
ptr++;
}
}
//2默认放置在最后
}
};


class Solution {
public:
void nextPermutation(vector<int>& nums) {
int i=nums.size()-2;
//确保i以后的序列是单减的!
while(i>=0&&nums[i]>=nums[i+1]){
i--;
}
int j=nums.size()-1;
if(i>=0){
while(j>=0&&nums[i]>=nums[j]){
j--;
}
swap(nums[i],nums[j]);
}
reverse(nums.begin()+i+1,nums.end());//从下标为i+1处翻转
}
};


287.寻找重复数


class Solution {
public:
int findDuplicate(vector<int>& nums) {
int l=1;
int r=nums.size()-1;//题目一致数字范围[1,n],因为n+1=nums.size(),所以数字范围[1,nums.size()-1]
int ans=-1;
while(l<=r){
int mid=(l+r)>>1;
int cnt=0;//计算小于等于mid
for(int i=0;i<nums.size();i++){
if(nums[i]<=mid){
cnt++;
}
}
if(cnt<=mid){//小于等于中间数的数字个数<=中间数-->这段期间没有重复元素
l=mid+1;
}
else{
r=mid-1;
ans=mid;
}
}
return ans;
}
};

浙公网安备 33010602011771号