首页 > 其他分享 >力扣第 376 场周赛(三分,中位数贪心,滑动窗口)

力扣第 376 场周赛(三分,中位数贪心,滑动窗口)

时间:2023-12-18 10:14:06浏览次数:28  
标签:周赛 return nums int 力扣 flag cost left 376

 用一个哈希表记录一下,然后遍历统计一下即可。

class Solution {
public:
    vector<int> findMissingAndRepeatedValues(vector<vector<int>>& grid) {
        int n = grid.size();
        unordered_set<int> st;
        vector<int> res;
        
        for(int i = 0; i < n; i ++ ) {
            for(int j = 0; j < n; j ++ ) {
                if(st.count(grid[i][j])) {
                    res.push_back(grid[i][j]);
                }
                st.insert(grid[i][j]);
            }
        }
        
        for(int i = 1; i <= n * n; i ++ ) {
            if(!st.count(i)) {
                res.push_back(i);
                break;
            }
        }
        
        return res;
    }
};

 

 

 排序+贪心

class Solution {
public:
    vector<vector<int>> divideArray(vector<int>& nums, int k) {
        vector<vector<int>> res;
        int n = nums.size();
        sort(nums.begin(), nums.end());
        
        for(int i = 0; i + 2 < n; i += 3) {
            if(nums[i + 2] - nums[i] > k) return {};
        }
        
        for(int i = 0; i + 2 < n; i += 3) {
            res.push_back({nums[i], nums[i + 1], nums[i + 2]});
        }
        
        return res;
    }
};

 

 先是在比赛时想到的三分写法

class Solution:
    def minimumCost(self, nums: List[int]) -> int:
        def cost(x: int, flag: int) -> int:
            s = str(x)
            if flag == 0:
                y = int(s[:-1] + s[::-1])
            else:
                y = int(s + s[::-1])

            return sum(abs(k - y) for k in nums)


        def search(flag: int) -> int:
            l, r = 0, 99999
            while l + 2 < r:
                m1 = (l * 2 + r) // 3
                m2 = (l + r * 2) // 3
                f1 = cost(m1, flag)
                f2 = cost(m2, flag)
                if f1 > f2:
                    l = m1
                else:
                    r = m2

            return min(cost(l, flag), cost(r, flag), cost(l + 1, flag))


        return min(search(0), search(1))

然后是灵神讲的中位数贪心

pal = []
base = 1

while base <= 10000:
    for i in range(base, base * 10):
        x = i
        t = i // 10
        while t:
            x = x * 10 + t % 10
            t //= 10
        pal.append(x)
    if base <= 1000:
        for i in range(base, base * 10):
            x = t = i
            while t:
                x = x * 10 + t % 10
                t //= 10
            pal.append(x)
    base *= 10

pal.append(10**9 + 1)

class Solution:
    def minimumCost(self, nums: List[int]) -> int:
        nums.sort()
        
        def cost(i: int) -> int:
            target = pal[i]
            return sum(abs(x - target) for x in nums)

        n = len(nums)
        i = bisect_left(pal, nums[(n - 1) // 2])
        
        return min(cost(i - 1), cost(i))
        

 

 滑动窗口+前缀和操作统计+中位数贪心

class Solution:
    def maxFrequencyScore(self, nums: List[int], k: int) -> int:
        nums.sort()
        n = len(nums)
        s = list(accumulate(nums, initial=0))

        def d_sum(l: int, i: int, r: int) -> int:
            left = nums[i] * (i - l) - (s[i] - s[l])
            right = s[r + 1] - s[i + 1] - nums[i] * (r - i)
            return left + right
        
        ans = left = 0
        for i in range(n):
            while d_sum(left, (left + i) // 2, i) > k:
                left += 1
            ans = max(ans, i - left + 1)

        return ans

 

标签:周赛,return,nums,int,力扣,flag,cost,left,376
From: https://www.cnblogs.com/zk6696/p/17910057.html

相关文章

  • 3力扣-罗马数字转整数
    力扣刷题,今天做这题,一开始就想到了使用字典来存储罗马数字,但是想不到怎么解决小的在左减,小的在右加,后面只好借助题解,看完题解顿时灵光乍现,但是题解里面有个num+dicts[s[i]]-2*last的一开始想不明白,后面画表就明白了。题目罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。例如,罗......
  • 牛客周赛 Round 24
    牛客周赛Round24比赛地址最后一题没想到用二分做,可惜可惜,思考的方向错了A小红的矩阵构造题目链接思路:主要是区分一下n是奇数还是偶数,是奇数的话就正常输出就行,是偶数的话就可以把偶数行逆着输出代码:#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ intn......
  • Acwing.第134场周赛
    Acwing.第134场周赛比赛地址A排序题目思路:简单的模拟代码:#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ inta,b,c; cin>>a>>b>>c; intans=a+b+c; intmaxn=max(a,max(b,c)); intminn=min(a,min(b,c)); cout<<minn<<"......
  • 力扣141-环形链表
    难度:【简单】第一遍:用最朴素的算法写,一个HashSet保存访问过的节点,但是仅保存了节点的value,出现值相等的节点算法就会失效。提交后当然是“解答错误”。第二遍:修改HashSet数据类型,重新提交后显示“通过”。第三遍:优化空间复杂度到O(1)。没有思路就参考了官方题解,使用了快慢指针......
  • 力扣136-只出现一次的数字
    难度:【简单】1.第一反应是对每个元素出现的次数计数,然后找到计数为1的元素。但是题目要求额外使用空间为常量,该方法不符合要求。2.既然空间复杂度是常数级别,那就尝试用一个变量解决,用一个变量对每个元素计数,当遇到重复的元素时变量置零,但是还是要保存访问过的元素,不符合条件。......
  • 力扣146 螺旋遍历二维数组
    Problem: LCR146.螺旋遍历二维数组思路多个循环螺旋模拟classSolution{public:vector<int>spiralArray(vector<vector<int>>&array){vector<int>res;intm=array.size();if(m==0){returnres;}......
  • 力扣2477. 到达首都的最少油耗(dfs+贪心)
    给你一棵 n 个节点的树(一个无向、连通、无环图),每个节点表示一个城市,编号从 0 到 n-1 ,且恰好有 n-1 条路。0 是首都。给你一个二维整数数组 roads ,其中 roads[i]=[ai,bi] ,表示城市 ai 和 bi 之间有一条 双向路 。每个城市里有一个代表,他们都要去首都参......
  • 力扣101-对称二叉树
    该题难度为【简单】1.尝试自己写,哪怕写个暴力解法也行,没写出来,看官方题解。2.扫了一眼,不太理解,又想了一会“我代码里漏掉的一半在官方思路中是怎么补上的”,再从头看一遍文字解析,“原来是两棵树对比”。这样思路就清晰了,用递归遍历每个节点,比较每次遍历的“根节点”即可。3.......
  • 力扣1200 最小绝对差
    Problem: 1200.最小绝对差思路先排序(用sort),找出最小绝对差,然后再次遍历添加数组classSolution{public:vector<vector<int>>minimumAbsDifference(vector<int>&arr){vector<vector<int>>res;sort(arr.begin(),arr.end());in......
  • 力扣70-爬楼梯
    该题难度为【简单】第一遍:暴力解法,写了一个递归,时间复杂度特别高,提交后显示“超时”。第二遍:看了一遍官方的题解后,使用了一个临时变量保存每一步的计算结果,先查询是否已经计算过,如果查不到结果再计算。提交后显示“通过”。第三遍:看官方解法的时候,我是先看代码的,完全看不懂为什......