杂题

169.多数元素

image

方法一:哈希表

时间复杂度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.只出现一次的数字

image

方法:异或运算

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ans=0;
        for(int i:nums){
            ans=ans^i;
        }
       return ans;
    }
};

75.颜色分类

image

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默认放置在最后
    }
};

image

image

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处翻转
    }
};

image

image

287.寻找重复数

image

image

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;
    }
};

 

posted @ 2025-11-26 23:36  Annaprincess  阅读(4)  评论(0)    收藏  举报