力扣第202场周赛

5185. 存在连续三个奇数的数组

思路:
	记录奇数的个数,遇见偶数则置0,如果达到3了就返回true
代码如下:
class Solution {
public:
    bool threeConsecutiveOdds(vector<int>& arr) {
        int num = 0 ;
        for(auto i : arr){
            if(i % 2 == 1)
                num ++ ;		//遇见奇数,num ++ 记录奇数个数
            else
                num = 0 ;		//遇见偶数重置
            if(num == 3)
                return true ;	//达到3个了返回ture
        }
        return false ;		//前面没有返回,说明没有符合要求的
    }
};

5488. 使数组中所有元素相等的最小操作数

思路:
	首先可以肯定的是要将他们变为数组的中位数,且中位数左边第i个数和右边第i个数与中位数的差值相同
	所以,只需要求出中位数左边的数与中位数的差值之和即可
	差值可以看成等差数列
	所以对于	奇数:从2 到 n - 1,一共有n / 2 个(int自动向下取整)
					偶数:从1到n - 1 ,一共有n / 2 个
代码如下:
class Solution {
public:
    int minOperations(int n) {
        if(n % 2 == 1)
            return (n + 1) * (n / 2) / 2 ;		//奇数
        return n * (n / 2) / 2 ;    	//偶数
    }
};

5489. 两球之间的磁力

思路:
	使用二分查找法找出结果
	细节见注释
代码如下:
const int INF = 1000000000 ;
class Solution {
public:
    bool check(int d , vector<int>& p , int m , int len){
        int place = p[0] ;		//左端放一个
        m -- ;		//球减少一个
        for(int i = 1 ; i < len && m > 0 ; ++ i)
            if(p[i] - place >= d) {		//p[i]可以放
                place = p[i] ;		//p[i]处放一个球
                m-- ;		//球减少一个
            }
        return m == 0 ;		//看球是否放完,如果放完说明此时的d不大
    }

    int maxDistance(vector<int>& position, int m) {
        int n = position.size() , ans = 0 ;
        sort(position.begin() , position.end()) ;		//先排序,再使用二分查找
        int l = 0 , r = INF ;
        while (l <= r){			//常规查找法
            int mid = (l + r) / 2 ;
            if(check(mid , position , m , n)){
                ans = max(mid , ans) ;		//ans取最大数
                l = mid + 1 ;
            }
            else
                r = mid  - 1 ;
        }
        return ans ;
    }
};

5490. 吃掉 N 个橘子的最少天数

思路:
		需要尽可能吃n / 2 个 或者 2 * (n / 3)个才可能使天数最少
		直接dfs会比较简单
代码如下:
class Solution {
public:
    map<int , int> dp ;
    int minDays(int n) {
        if(n == 0)
            return 0 ;		//n / 2 和 n / 3可能为0
        if(n == 1)
            return 1 ;
        if(dp.count(n))
            return dp[n] ;
        int res = min(minDays(n / 2) + n % 2 + 1 , minDays(n / 3) + n % 3 + 1) ;	//模拟吃n / 2和 2 * (n / 3),找到所需天数最少
        dp[n] = res ;
        return res ;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值