Rank:389 / 4987,AC:3/4,Score:13/18

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

比赛的时候写复杂了。。

  1. class Solution {
  2. public:
  3. bool threeConsecutiveOdds(vector<int>& arr) {
  4. vector<int> even;
  5. for(int i=0;i<arr.size();i++){
  6. if(arr[i]%2){
  7. even.push_back(i);
  8. }
  9. }
  10. if(even.size()<3) return false;
  11. for(int i=0;i<even.size();i++){
  12. int j=i;
  13. if(j+2>=even.size()) break;
  14. if(even[j]+1==even[j+1]&&even[j+1]+1==even[j+2]) return true;
  15. }
  16. return false;
  17. }
  18. };

赛后看了别人的代码,自惭形愧…
其实这样写就行了..

  1. class Solution {
  2. public:
  3. bool threeConsecutiveOdds(vector<int>& arr) {
  4. for(int i=0;i+2<arr.size();i++){
  5. if(arr[i]%2&&arr[i+1]%2&&arr[i+2]%2) return true;
  6. }
  7. return false;
  8. }
  9. };

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

这个序列是 首项为1,尾项为(2*n-1),公差为2的等差数列,然后我们可以算一下平均数为LeetcodeWeeklyContest-202 - 图1,按照平均数为对称轴从两边选就行,然后结果就是从1到n之前的数的差。
其实还可以继续推,当n为偶数时,LeetcodeWeeklyContest-202 - 图2;当n为奇数的时候 , LeetcodeWeeklyContest-202 - 图3,当n为奇数的时候刚好截断,所以最后直接返回LeetcodeWeeklyContest-202 - 图4即可.

  1. class Solution {
  2. public:
  3. int minOperations(int n) {
  4. int res = 0;
  5. for(int i=1;i<n;i=i+2){
  6. res += (n-i);
  7. cout << n-i << endl;
  8. }
  9. return res;
  10. // return n*n/4;
  11. }
  12. };
  13. // 推公式写法
  14. class Solution {
  15. public:
  16. int minOperations(int n) {
  17. return n*n/4;
  18. }
  19. };

5489. 两球之间的磁力

任意两球间 最小磁力 最大, 根据题目的这种描述, 是要用二分,类似楼上扔鸡蛋的问题,将题目转换一下就是从n中选m个点让其间距尽可能的大.
时间复杂度: LeetcodeWeeklyContest-202 - 图5

  1. class Solution {
  2. public:
  3. int maxDistance(vector<int>& pos, int m) {
  4. sort(pos.begin(),pos.end()); // pos数组可能是无序的,需要排序
  5. int l = 0, r = 1e9;
  6. while(l<r){
  7. int mid = l+r+1 >>1;
  8. int count = 1,last = pos[0];
  9. for(int i=1;i<pos.size();i++){
  10. if(pos[i]-last>=mid) count ++,last = pos[i];
  11. }
  12. if(count>=m) l = mid;
  13. else r = mid-1;
  14. }
  15. return l;
  16. }
  17. };

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

DFS 记忆化写法

  1. class Solution {
  2. public:
  3. unordered_map<int,int> hash;
  4. int dfs(int n){
  5. if(n==1) return 1;
  6. if(hash[n]!=0) return hash[n];
  7. // 定义该子问题的结果
  8. int res = n; // 最坏情况是每天吃一个
  9. if(n%3==0) res = min(res,dfs(n/3)+1);
  10. if(n%2==0) res = min(res,dfs(n/2)+1);
  11. // 如果能被6整除,就不尝试-1的情况,算是剪枝,不然会TLE
  12. if(n%6) res = min(res,dfs(n-1)+1);
  13. hash[n] = res;
  14. return res;
  15. }
  16. int minDays(int n) {
  17. return dfs(n);
  18. }
  19. };

BFS写法

  1. class Solution {
  2. public:
  3. unordered_set<int> vis;
  4. int minDays(int n) {
  5. queue<int> qu,qu_next;
  6. qu.push(n);
  7. vis.insert(n);
  8. int ans = 0;
  9. while(true){
  10. while(qu.size()){
  11. int e = qu.front(); qu.pop();
  12. if(!e) return ans;
  13. if(e%3==0&&vis.count(e/3)==0) {
  14. qu_next.push(e/3), vis.insert(e/3);
  15. }
  16. if(e%2==0&&vis.count(e/2)==0) {
  17. qu_next.push(e/2), vis.insert(e/2);
  18. }
  19. // 加个e%6的剪枝会快一点
  20. if(e%6&&vis.count(e-1)==0){
  21. qu_next.push(e-1), vis.insert(e-1);
  22. }
  23. }
  24. ans++; qu = qu_next;
  25. }
  26. return n;
  27. }
  28. };