目录
Day1 数组
一、1588. 所有奇数长度子数组的和
class Solution {
public:
int sumOddLengthSubarrays(vector<int>& arr) {
int sz=arr.size(),ret=0;
for(int i=0;i<sz;++i)
{
int sum=0;
for(int j=i;j<sz;++j)
{
sum+=arr[j];
if((j-i+1)&1)
ret+=sum;
}
}
return ret;
}
};
二、1848. 到目标元素的最小距离
class Solution {
public:
int getMinDistance(vector<int>& nums, int target, int start) {
int ret=10001;
for(int i=0;i<nums.size();++i)
{
if(nums[i]==target)
{
ret=ret > abs(i-start) ? abs(i-start) : ret;
}
}
return ret;
}
};
三、1652. 拆炸弹
class Solution {
public:
vector<int> decrypt(vector<int>& code, int k) {
int sz=code.size();
if(k==0){
vector<int> ans(sz,0);
return ans;
}
vector<int> ret(sz);
for(int i=0;i<sz;++i)
{
if(k>0)
{
for(int j=1;j<=k;++j)
{
ret[i]+=code[(i+j)%sz];
}
}
else if(k<0)
{
for(int j=-1;j>=k;--j)
{
ret[i]+=code[(i+j+sz)%sz];
}
}
}
return ret;
}
};
四、1640. 能否连接形成数组
class Solution {
public:
bool canFormArray(vector<int>& arr, vector<vector<int>>& pieces) {
int sz=arr.size();
for(auto set : pieces)
{
int k=0;
for(k=0;k<sz;++k)
{
if(arr[k]==set[0])
break;
}
if(k==sz&&arr[sz-1]!=set[0])
return false;
for(int i=0;i<set.size();++i)
{
if(set[i]!=arr[k+i])
return false;
}
}
return true;
}
};
Day2 字符串
一、2278. 字母在字符串中的百分比
class Solution {
public:
int percentageLetter(string s, char letter) {
int freq=0;
for(auto it : s)
{
if(letter==it)
freq++;
}
return (100*freq)/s.length();
}
};
二、551. 学生出勤记录 I
class Solution {
public:
bool checkRecord(string s) {
int freq_A=0,freq_L=0;
for(auto &ch:s)
{
switch(ch)
{
case 'A':
freq_L=0;
++freq_A;
break;
case 'L':
++freq_L;
break;
case 'P':
freq_L=0;
break;
}
if(freq_A>=2||freq_L>=3)
return false;
}
return true;
}
};
三、2255. 统计是给定字符串前缀的字符串数目
class Solution {
public:
int countPrefixes(vector<string>& words, string s) {
int ret=0;
for(auto it:words)
{
string sub_s=s.substr(0,it.length());
if(it==sub_s)
ret++;
}
return ret;
}
};
四、1071. 字符串的最大公因子
先找到字符串长读的最大公因子很关键
class Solution {
public:
int gcd(int a,int b){
return !b ? a : gcd(b,a%b) ;
}
string gcdOfStrings(string str1, string str2) {
if (str1 + str2 != str2 + str1) return "";
return str1.substr(0, gcd(str1.size(), str2.size()));
}
};
Day3 排序
一、1464. 数组中两元素的最大乘积
class Solution {
public:
int maxProduct(vector<int>& nums) {
sort(nums.begin(),nums.end());
return (*(nums.end()-1)-1)*(*(nums.end()-2)-1);
}
};
二、1636. 按照频率将数组升序排序
class Solution {
#define base 100
public:
vector<int> frequencySort(vector<int>& nums) {
int hash[201],i;
memset(hash,0,sizeof(hash));
for(i=0;i<nums.size();++i)
{
++hash[nums[i]+base];
}
sort(nums.begin(),nums.end(),[&](const int& a,const int& b)
{
if(hash[a+base]!=hash[b+base])
{
return hash[a+base]<hash[b+base];
}
return a>b;
});
return nums;
}
};
这个sort里内联了一个排序方法函数,比较出现的频率,频率相同就比较大小
三、1287. 有序数组中出现次数超过25%的元素
学到了一个新的STL容器搜索方法
lower_bound和uper_bound(begin,end,num)
即用在[begin,end-1]二分查找小/大于num的
class Solution {
public:
int findSpecialInteger(vector<int>& arr) {
int n = arr.size();
int span = n / 4 + 1;
for (int i = 0; i < n; i += span) {
auto iter_l = lower_bound(arr.begin(), arr.end(), arr[i]);
auto iter_r = upper_bound(arr.begin(), arr.end(), arr[i]);
if (iter_r - iter_l >= span) {
return arr[i];
}
}
return -1;
}
};
四、436. 寻找右区间
题解区的双指针法,暂时没看懂
自己写的是分别存储左右区间,然后左区间比较右区间的最大值
class Solution {
public:
vector<int> findRightInterval(vector<vector<int>>& intervals) {
vector<pair<int, int>> startIntervals;
vector<pair<int, int>> endIntervals;
int n = intervals.size();
for (int i = 0; i < n; i++) {
startIntervals.emplace_back(intervals[i][0], i);
endIntervals.emplace_back(intervals[i][1], i);
}
sort(startIntervals.begin(), startIntervals.end());
sort(endIntervals.begin(), endIntervals.end());
vector<int> ans(n, -1);
for (int i = 0, j = 0; i < n && j < n; i++) {
while (j < n && endIntervals[i].first > startIntervals[j].first) {
j++;
}
if (j < n) {
ans[endIntervals[i].second] = startIntervals[j].second;
}
}
return ans;
}
};
Day4 贪心
一、1221. 分割平衡字符串
要想平衡字符串尽量多,就需要L和R等量分布在字符串的两边(贪心居然在这里)
遇‘L’就加一,遇‘R’就减一,计数器为0说明遍历完一个平衡字符串
class Solution {
public:
int balancedStringSplit(string s) {
int ret=0,cnt=0;
for(int i=0;i<s.size();++i)
{
cnt+=(s[i]=='L'? +1 : -1);
if(cnt==0)
++ret;
}
return ret;
}
};
二、1217. 玩筹码
class Solution {
public:
int minCostToMoveChips(vector<int>& position) {
int cost,min_cost=2147483647;
for(int i=0;i<position.size();++i)
{
cost=0;
for(int j=0;j<position.size();++j)
{
if((position[j]-position[i])&1)
++cost;
}
min_cost=(cost<min_cost ? cost : min_cost);
}
return min_cost;
}
};
三、1029. 两地调度
考虑所有人都去B,再考虑选派n人去A,找到A费用-B费用最小的n人
class Solution {
public:
int twoCitySchedCost(vector<vector<int>>& costs) {
int min_cost=0;
vector<int>diff(costs.size());
for(int i=0;i<costs.size();++i)
diff[i]=costs[i][0]-costs[i][1];
sort(diff.begin(),diff.end());
for(int i=0;i<costs.size()/2;++i)
min_cost+=(costs[i][1]+diff[i]);
for(int i=costs.size()/2;i<costs.size();++i)
min_cost+=costs[i][1];
return min_cost;
}
};
四、面试题 10.11. 峰与谷
排序后依次取尾头尾头.....
class Solution {
public:
void wiggleSort(vector<int>& nums) {
vector<int>copy(nums);
sort(copy.begin(),copy.end());
int l=0,r=nums.size()-1;
int i=0;
while(l<r)
{
nums[i++]=copy[r--];
nums[i++]=copy[l++];
}
if(l==r)
nums[i]=copy[l];
}
};