2020/8/2第两百场力扣赛题解

在这里插入图片描述
这题最简单,不需要题解,暴力就好了

在这里插入图片描述

这道题目,脑子转过弯了就好说。
	1.其实就是比大小变种。如果这个数比另一个数大这个就占据不到0号位子,之后他永远抢不回0号位子
	2.如果比到最后了,那么这个数字必定是最大的。前面没有出现冠军的话。

class Solution {
public:
    int getWinner(vector<int>& arr, int k) {
        if(k>=arr.size())
        {
            int tmp = arr[0];
            for(int i = 1;i<arr.size();i++)
                if(tmp<arr[i])
                    tmp = arr[i];
            return tmp;
        }
        int tmp = arr[0];int index = 0;
        int sum = 0;
        for(int i = 1;i<arr.size();i++)
        {
            if(arr[i]>tmp){
                tmp = arr[i];//如果比他大,更新一下
                index = i;
                sum = 1;
            }
            else
            {
                sum++;
            }
            if(sum>=k)
                return tmp;
        }
        return tmp;//比到最后了,这个必定是最大值。
    }
};

在这里插入图片描述
这个一时间看错题目了。

这个题目:
	1.找到后缀开始,变到一维数组里面保存
	2.从最大的地方开始,也就是说:从第一个开始。
	3.找最近最好的,如果没有弹出来
class Solution {
public:
    int minSwaps(vector<vector<int>>& grid) {
        int n = grid.size();
        vector<int> a;
        for(int i = 0;i<n;i++)
        {
            int sum = 0;
            for(int j = n-1;j>=0;j--)
            {
                if(grid[i][j]==0)sum++;
                else 
                    break;
            }
            a.push_back(sum);
        }//统计一下后缀0
        int sum = 0;//答案
        for(int i = 0;i<n-1;i++)
        {
            if(a[i] >= n - i - 1)continue;
            else
            {
                bool ppp = 0;//标记
                int j;
                for(j = i;j<n;j++)
                {
                    if(a[j]>=n-i-1)
                        {
                            ppp = 1;
                            break;
                        }
                }
                if(ppp==0)
                    return -1;
                for(;j>i;j--)
                {
                    swap(a[j],a[j-1]);//交换一下,模拟一下
                    sum++;
                }
            }
        }
        return sum ;
    }
};

在这里插入图片描述

这个题目比较灵活,但是一看到就知道是DP,但是本人比较菜。喜欢别的方法
	1.第一这个是有序的(比赛的时候,一直没注意到这个问题)
	2.我们统计每一段的值,如果可以选择的话,我们选最大值
		2.1.首先我们将可以交换的地方作为起点,将下一个可以交换的地方作为结束点
		2.2.先统计这一段的值,然后在比较,选这段的最大值
		2.3.一直重复
class Solution {
public:
    int maxSum(vector<int>& nums1, vector<int>& nums2) {
        
        int n1 = nums1.size(),n2=nums2.size();
        long sum1 = 0, sum2 = 0;
        long res = 0;
        int i = 0, j = 0;
        while(i < n1&& j < n2){
            if(nums1[i] == nums2[j]){
                res += (max(sum1, sum2) + nums1[i]);//选择最大值
                sum1 = 0;//两个清零
                sum2 = 0;
                i++;
                j++;
            }
            else if(nums1[i] < nums2[j]){
                sum1 += nums1[i];//统计值
                i++;                
            }
            else{
                sum2 += nums2[j];//统计值
                j++;
            }            
        }
        //其中必有一个长的还没有统计完,最后在统计好
        while(i < n1){
            sum1 += nums1[i];
            i++;
        }
        while(j < n2){
            sum2 += nums2[j];
            j++;
        }
        res += max(sum1, sum2);
        return res % ((int)pow(10, 9) + 7 );
    
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值