算法刷题计划(九)求众数 II、构造矩形、实现 strStr()、两数相除、下一个排列

一、求众数 II

  • 题目:
    在这里插入图片描述

题解(哈希):

class Solution {
public:
    vector<int> majorityElement(vector<int>& nums) {
        if(nums.empty())    return {};
        if(nums.size()==1)  return {nums[0]};
        int n=nums.size();
        int times=n/3;
        for(int i=0;i<n;i++)    map[nums[i]]++;
        for(auto&p:map){
            if(p.second>times)  v.push_back(p.first);
        }
        if(!v.empty())  return v;
        return {};
    }
private:
    unordered_map<int,int>map;
    vector<int>v;
};

二、构造矩形

  • 题目:

在这里插入图片描述


题解:

/*class Solution{
public:
    vector<int> constructRectangle(int area) {
        int l=1,w=0;
        vector<vector<int>>v;
        while(l<=area){
            w=area/l;
            int carry=w*10;
            if((carry%10==0)&&(l>=w)&&(l*w==area)) v.push_back({l,w});
            l++;
        }
        if(!v.empty()){
            vector<int>vv=v[0];
            int sumMin=v[0][0]-v[0][1];
            for(auto&pr:v){
                int num=pr[0];
                for(auto&pri:pr){
                    num-=pri;
                    cout<<pri<<" ";
                }
                cout<<endl;
                if(sumMin>num){
                    sumMin=num;
                    vv=pr;
                }
            }
            return vv;
        }
        return {};       
    }
};*/
class Solution {
public:
    vector<int> constructRectangle(int area) {
        int w = sqrt(1.0 * area);
        while (area % w) {
            --w;
        }
        return {area / w, w};
    }
};

三、实现 strStr()

  • 题目:
    在这里插入图片描述

  • 题解:
    • 暴力
class Solution {
public:
    int strStr(string str1, string str2){ 
        
       if(str1.size()==0&&str2.size()==0) return 0;
        if(str1.size()==0) return -1;
        if(str2.size()==0) return 0;
       int fast=0,slow=0;
        while(fast<str1.size()){
            if(str1[fast]!=str2[slow]){
                fast++;
            }else{
                int index=fast;
                while(str1[index]==str2[slow]){
                    if(slow<str2.size())index++,slow++;
                }
                if(slow==str2.size())return fast;
                slow=0;fast++;
            }
        }
        return -1;
      }
};
  • kmp
class Solution {
public:
    int strStr(string str1, string str2){ 
        
       if(str1.size()==0&&str2.size()==0) return 0;
        if(str1.size()==0) return -1;
        if(str2.size()==0) return 0;
        calNext(str2,next);
        int k=-1;
        for(int i=0;i<str1.size();i++){
            while(k>-1&&str1[i]!=str2[k+1])k=next[k];
            if(str2[k+1]==str1[i])k=k+1;
            if(k==str2.size()-1)return i-str2.size()+1;
        }
        return -1;
    }
    void calNext(string str,vector<int>&next){
        int k=-1;
        for(int i=1;i<str.size();i++){
            while(k>-1&&str[k+1]!=str[i])k=next[k];
            if(str[k+1]==str[i])k=k+1;
            next.push_back(k);
        }
    }
private:
    vector<int>next{-1};
};

四、两数相除

  • 题目:

在这里插入图片描述


  • 题解
class Solution {
public:
    int divide(int dividend, int divisor) {
        if(dividend==0) return 0;
        if(divisor==1)  return dividend;
        if(divisor==-1){
            if(dividend>INT_MIN)  return -dividend;
            return INT_MAX;
        }
        long a=dividend,b=divisor;
        int sign=1;//初始化符号
        if((a>0&&b<0)||(a<0&&b>0))  sign=-1;
        a=a>0?a:-a;
        b=b>0?b:-b;
        int res=div(a,b);
        if(sign==1) return res>INT_MAX?INT_MAX:res;
        return -res;
    }
    int div(long a,long b){
        if(a<b) return 0;
        long count=1;
        long carryB=b;
        while((carryB*2)<=a){
            count*=2;
            carryB*=2;
        }
        return count+div(a-carryB,b);
    }
};

五、下一个排列

在这里插入图片描述


  • 题解:
class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        int n=nums.size();
        int i=n-1;
        for(;i>0;i--){
            if(nums[i]>nums[i-1]){
                for(int j=n-1;j>i-1;j--){
                    if(nums[j]>nums[i-1]){
                        nums[j]=nums[j]^nums[i-1];
                        nums[i-1]=nums[j]^nums[i-1];
                        nums[j]=nums[j]^nums[i-1];
                        break;
                    }
                }
                break;
            }
        }
        if(i==0){
            sort(nums.begin(),nums.end());
        }else{
            sort(nums.begin()+i,nums.end());
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值