六月集训 长期更新

目录

Day1 数组

一、1588. 所有奇数长度子数组的和

二、1848. 到目标元素的最小距离

三、1652. 拆炸弹

四、1640. 能否连接形成数组

Day2 字符串

一、2278. 字母在字符串中的百分比

二、551. 学生出勤记录 I

三、2255. 统计是给定字符串前缀的字符串数目

四、1071. 字符串的最大公因子

Day3 排序

一、1464. 数组中两元素的最大乘积

二、1636. 按照频率将数组升序排序

三、1287. 有序数组中出现次数超过25%的元素

四、436. 寻找右区间

Day4 贪心

一、1221. 分割平衡字符串​​​​​​

二、1217. 玩筹码

三、1029. 两地调度

四、面试题 10.11. 峰与谷


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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值