leetcode404周赛(1,2,3)

1.三角形的最大高度

题意:给你两个整数red和blue,需要用这些求组成一个三角形,相邻行颜色必须不同,求最大高度

思路:第一行放一个,第二行放两个第三行放三个,我们可以按奇数偶数行来计算总和,此时有两种情况,先蓝后红,先红后蓝,此时针对于第i行来说,如果

先蓝后红 此时对应奇偶行的蓝的数量不够或者红的数量不够,同时在先红后蓝这种情况下,红的数量或者蓝的数量也不够,两种情况都不能填充第i行,那么最大高度为第i-1行

ac代码:

class Solution {
public:
    int maxHeightOfTriangle(int red, int blue) {
         int cnt[2]={0,0};

         for(int i=1;i<=2000;i++){
               cnt[i%2]+=i;
           if((cnt[0]>red||cnt[1]>blue)&&(cnt[0]>blue||cnt[1]>red))
                return i-1;    
         }


   return 0;

    }
};

2.z找出有效子序列的最大长度I

题意:给一个整数数组,有效子序列的定义为:

(sub[0] + sub[1]) % 2 == (sub[1] + sub[2]) % 2 == ... == (sub[x - 2] + sub[x - 1]) % 2

返回数组的最长的有效子序列的长度

思路:模数是固定为2的,那么情况只有0,1,那么要使得相邻项数满足有效子序列的定义,则有四种情况,0000,1111,0101,1010,算出这四种情况的最大的长度取一个max

ac代码:

class Solution {
public:
    int maximumLength(vector<int>& nums) {
        for(int i=0;i<nums.size();i++)
            nums[i]%=2;
    int cnt1=0,cnt2=0,cnt3=0,cnt4=0;

      for(int i=0;i<nums.size();i++)
          if(nums[i]==0)   cnt1++;

         for(int i=0;i<nums.size();i++)
          if(nums[i]==1)   cnt2++;

        int ok=0;
           for(int i=0;i<nums.size();i++)
           if(!ok&&nums[i]==0)    cnt3++,ok=1;
           else if(ok&&nums[i]==1) cnt3++,ok=0;

                 ok=0;
           for(int i=0;i<nums.size();i++)
           if(!ok&&nums[i]==1)    cnt4++,ok=1;
           else if(ok&&nums[i]==0) cnt4++,ok=0;     
     int res=max(cnt1,cnt2);
     res=max(res,cnt3);
     res=max(res,cnt4);
     return res;   
   
    }
};

3.找出有效子序列的最大长度II

题意:和上一题一样,只是模数2换成了k

思路:通过这个式子(sub[i] + sub[i+1]) % k == (sub[i+1] + sub[i+2]) % k可以变形成为(sub[i] + sub[i+1])-(sub[i+1] + sub[i+2])%k==0即(sub[i]-sub[i+2])%k==0,因此sub[i]和sub[i+2]同余,只要寻找一个最长的子序列,满足子序列奇数项都相同,偶数项都相同即可满足条件,因此我们可以设一个函数f[y][x]表示当前已i为结尾的数后两位(肯定为一奇一偶),我们在这个后面添加nums[i],那么最后两项模k分别为x和y的子序列的长度会增加1

ac代码:

class Solution {
public:
    int maximumLength(vector<int>& nums, int k) {
        int ans = 0;
        vector<vector<int>> f(k, vector<int>(k));
        for (int x : nums) {
            x %= k;
            for (int y = 0; y < k; y++) {
                f[y][x] = f[x][y] + 1;
                ans = max(ans, f[y][x]);
            }
        }
        return ans;
    }
};
  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值