统计有序矩阵中的负数
题意:如题目所示。
思路:模拟就好。
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; } };
最后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; } };
最多可参加的会议数目
题意:
给你一个数组 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; } };
多次求和构造目标数组
题意:
给你一个整数数组 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; } };