一、求众数 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());
}
}
};