第 176 场周赛

传送门

统计有序矩阵中的负数

题意:如题目所示。

思路:模拟就好。

class Solution {
public:
    int countNegatives(vector<vector<int>>& grid) {
        int ans=0;
        for(auto x:grid)for(auto y:x)if(y<0)ans++;
        return ans;
    }
};
Code

最后k个数的乘积

题意:

请你实现一个「数字乘积类」ProductOfNumbers,要求支持下述两种方法:

1. add(int num)

将数字 num 添加到当前数字列表的最后面。
2. getProduct(int k)

返回当前数字列表中,最后 k 个数字的乘积。

思路:vector存值,遍历k个数统计就行。

class ProductOfNumbers {
public:
    vector<int> vt;
    ProductOfNumbers() {
    }
    
    void add(int num) {
        vt.push_back(num);
    }
    
    int getProduct(int k) {
        int len = vt.size();
        int ans =1,i=len-1;
        while(k--){
            ans*=vt[i];
            i--;
        }
        return ans;
    }
};
Code

最多可参加的会议数目

题意:

给你一个数组 events,其中 events[i] = [startDayi, endDayi] ,表示会议 i 开始于 startDayi ,结束于 endDayi 。

你可以在满足 startDayi <= d <= endDayi 中的任意一天 d 参加会议 i 。注意,一天只能参加一个会议。

请你返回你可以参加的 最大 会议数目。

思路:贪心的思想,先按会议结束的位置排序,然后使用一个vis数组记录该天是否已经使用,遍历会议,从start 到end 使用靠前的day用来参加会议(贪心思想)

class Solution {
public:
    int maxEvents(vector<vector<int>>& events) {
        sort(events.begin(), events.end(), [](vector<int>& v1, vector<int>& v2){
            return v1[1]==v2[1]?v1[0]<v2[0]:v1[1]<v2[1];
        });
        int res = 0;
        vector<bool> vis(100001, false);
        for(auto& v: events) {
            for(int i=v[0];i<=v[1]; i++) {
                if(!vis[i]) { vis[i]=true, res++; break; }
            }
        }
        return res;
    }
};
Code

多次求和构造目标数组

题意:

给你一个整数数组 target 。一开始,你有一个数组 A ,它的所有元素均为 1 ,你可以执行以下操作:

令 x 为你数组里所有元素的和
选择满足 0 <= i < target.size 的任意下标 i ,并让 A 数组里下标为 i 处的值为 x 。
你可以重复该过程任意次
如果能从 A 开始构造出目标数组 target ,请你返回 True ,否则返回 False 。

思路:查找规律题
既然是将sum加到某个位置,那么该位置一定是数组中的最大值
这样,每一轮寻找数组的最大值max和总和sum 那么数组最大值的位置改变为max-(sum-max)就是上一轮操作的数组
倒着往前操作,直到sum==n&&max==1 返回true 或者 max-(sum-max) 小于等于0 返回false;

class Solution {
public:
     bool isPossible(vector<int>& target) {
        long long sum = 0;
        priority_queue<long long >pq;
        for(auto i:target){
            sum += i;
            pq.push(i);
        }
        while(pq.top() > 1){
            auto mx = pq.top();
            pq.pop();
            long long  delta = sum-mx;
            if(mx <= delta)return 0;
            mx -= delta;
            sum -= delta;
            pq.push(mx);
        }
        return true;
    }
};
Code

猜你喜欢

转载自www.cnblogs.com/NukezY/p/12316561.html
今日推荐