• LeetCode周赛#202


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

    给你一个整数数组 arr,请你判断数组中是否存在连续三个元素都是奇数的情况:如果存在,请返回 true ;否则,返回 false

    1 <= arr.length <= 1000
    1 <= arr[i] <= 1000

    class Solution {
    public:
        bool threeConsecutiveOdds(vector<int>& arr) {
            int a = 0,b = 1,c = 2;
            while(c < arr.size()){
                if((arr[a]&1)&&(arr[b]&1)&&(arr[c]&1)) return true;
                a++;b++;c++;
            }
            return false;
        }
    };
    

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

    存在一个长度为 n 的数组 arr ,其中 arr[i] = (2 * i) + 1 ( 0 <= i < n )。

    一次操作中,你可以选出两个下标,记作 xy ( 0 <= x, y < n )并使 arr[x] 减去 1 、arr[y] 加上 1 (即 arr[x] -=1arr[y] += 1 )。最终的目标是使数组中的所有元素都 相等 。题目测试用例将会 保证 :在执行若干步操作后,数组中的所有元素最终可以全部相等。

    给你一个整数 n,即数组的长度。请你返回使数组 arr 中所有元素相等所需的 最小操作数 。

    class Solution {
    public:
        int minOperations(int n) {
            int ans = 0;
            for(int i = 0;i <=(n-1)/2;i++){
                ans += (n - 2*i -1);
            }
            return ans;
        }
    };
    

    C. 两球之间的磁力

    在代号为 C-137 的地球上,Rick 发现如果他将两个球放在他新发明的篮子里,它们之间会形成特殊形式的磁力。Rick 有 n 个空的篮子,第 i 个篮子的位置在 position[i] ,Morty 想把 m 个球放到这些篮子里,使得任意两球间 最小磁力 最大。

    已知两个球如果分别位于 xy ,那么它们之间的磁力为 |x - y|

    给你一个整数数组 position 和一个整数 m ,请你返回最大化的最小磁力。

    思路:

    二分答案

    class Solution {
    public:
        bool judge(int k,vector<int>& p,int m){
            int n = p.size();
            
            int now = p[0];
            int cnt = 1;
            auto x = p.begin();
            
            while(cnt < m){
                x = lower_bound(x,p.end(),now+k);
                if(x == p.end())return false;
                now = *x;
                cnt++;
            }
            return true;
        }
        int maxDistance(vector<int>& position, int m) {
            sort(position.begin(),position.end());
            
            int l = 1,r = position[position.size()-1] - position[0];
            int ans = 0;
            
            while(l <= r){
                int mid = l + r >> 1;
                if(judge(mid,position,m)){
                    l = mid + 1;
                    ans = max(ans,mid);
                }
                else{
                    r = mid - 1;
                }
                
            }
            return ans;
        }
    };
    

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

    厨房里总共有 n 个橘子,你决定每一天选择如下方式之一吃这些橘子:

    • 吃掉一个橘子。
    • 如果剩余橘子数 n 能被 2 整除,那么你可以吃掉 n/2 个橘子。
    • 如果剩余橘子数 n 能被 3 整除,那么你可以吃掉 2*(n/3) 个橘子。

    每天你只能从以上 3 种方案中选择一种方案。

    请你返回吃掉所有 n 个橘子的最少天数。

    1 <= n <= 2*10^9

    思路:

    记忆化搜索,复杂度并不会到2e9,因为不需要一直减1。

    class Solution {
    public:
        
        map<int,int>ans;
        int solve(int n){
            if(ans.count(n) != 0)return ans[n];
            if(n == 1)return ans[1] = 1;
            if(n % 2 == 0 && n % 3 == 0){
                return ans[n] = min(solve(n/2),solve(n/3)) + 1;
            }
            if(n % 2 == 0 && n % 3 != 0){
                return ans[n] = min(solve(n/2),solve(n-1)) + 1;
            }
            if(n % 2 != 0 && n % 3 == 0){
                return ans[n] = min(solve(n-1),solve(n/3)) + 1;
            }
            return ans[n] = solve(n-1) + 1;
        }
        int minDays(int n) {
            return solve(n);
        }
    };
    
  • 相关阅读:
    Martin Fowler关于IOC和DI的文章(原版)
    父类引用指向子类对象详解
    求中位数总结
    二叉树的遍历方法
    MySQL知识小结
    栈和队列的基础算法学习(EPI)
    链表的基础题目学习(EPI)
    数组和字符串的基础题目学习(EPI)
    基本类型算法题目学习(EPI)
    被C语言操作符优先级坑了
  • 原文地址:https://www.cnblogs.com/sduwh/p/13515603.html
Copyright © 2020-2023  润新知