当前位置:   article > 正文

关于力扣305周周赛的算法代码(动态规划周),解析后续会进行补充_给你一个下标从 0 开始、严格递增 的整数数组 a 和一个正整数 tar 。如果满足下述

给你一个下标从 0 开始、严格递增 的整数数组 a 和一个正整数 tar 。如果满足下述

力扣305周周赛算法完整代码,有参考各方大佬和自己的想法总结如下,也是第一次参加力扣周赛深有体会,后续可能持续更新力扣竞赛,解析还在编辑后续会 贴出来







6136. 算术三元组的数目

难度简单2收藏分享切换为英文接收动态反馈

给你一个下标从 0 开始、严格递增 的整数数组 nums 和一个正整数 diff 。如果满足下述全部条件,则三元组 (i, j, k) 就是一个 算术三元组 :

来自 <力扣>

  1.     //1.hash表写法
  2.     int arithmeticTriplets(vector<int>& nums, int diff) {
  3.         unordered_set<int> set;
  4.         int pre=0,count=1,res=0;
  5.         for(auto i:nums){
  6.             set.insert(i);
  7.         }
  8.         for(int i=0;i<nums.size();++i){
  9.             count=1;
  10.             pre=nums[i];
  11.             while(true){
  12.                 if(set.find(pre+diff)!=set.end()){
  13.                     count++;
  14.                     pre+=diff;
  15.                 }
  16.                 else break;
  17.                 if(count==3){ 
  18.                     res++;
  19.                     break;
  20.                 }
  21.             }
  22.         }
  23.         return res;
  24.     }

    //2.三指正

  1.     int arithmeticTriplets(vector<int>& nums,int diff){
  2.         int n=nums.size(),res=0;
  3.         for(int i=0,j=i+1,k=j+1;i<n;++i){
  4.             while(j+1<n&&nums[j]<nums[i]+diff) ++j;
  5.             k=max(k,j+1);
  6.             while(k<n&&nums[k]-nums[j]<diff) ++k;
  7.             if(k<n&&nums[k]-nums[j]==diff&&nums[j]-nums[i]==diff) ++res;
  8.         }
  9.         return res;
  10.     }

 

6139. 受限条件下可到达节点的数目(DFS/BFS/并查集)

来自 <力扣>

  1.     vector<vector<int>> e;
  2.     vector<bool> ban;
  3.     int res=0;
  4.     int reachableNodes(int n,vector<vector<int>>& edges,vector<int>& restricted){
  5.         e.resize(n);
  6.         ban.resize(n);
  7.         for(auto i:edges){
  8.             e[i[0]].push_back(i[1]);
  9.             e[i[1]].push_back(i[0]);
  10.         }
  11.         for(auto i:restricted){
  12.             ban[i]=true;
  13.         }
  14.         dfs(0,-1);
  15.         return res;
  16.     }
  17.     void dfs(int cur,int pre){
  18.         res++;
  19.         for(int i:e[cur]){
  20.             if(!ban[i]&&pre!=i){
  21.                 dfs(i,cur);
  22.             }
  23.         }
  24.     }

6137. 检查数组是否存在有效划分(动态规划)

来自 <力扣>

  1.     bool validPartition(vector<int>& nums) {
  2.         vector<bool> dp(nums.size()+1,false);
  3.         dp[0]=true;
  4.         for(int i=1;i<nums.size();++i){
  5.             int temp=nums[i];
  6.             if(dp[i-1]&&temp==nums[i-1]) dp[i+1]=true;
  7.             if(i>1&&dp[i-2]){
  8.                 if(nums[i-1]==nums[i-2]&&nums[i-1]==temp) dp[i+1]=true;
  9.                 if(nums[i-2]+1==nums[i-1]&&nums[i-1]+1==temp) dp[i+1]=true;
  10.             }
  11.         }
  12.         return dp[nums.size()];
  13.     }

6138. 最长理想子序列(动态规划)

来自 <力扣>

  1.     int longestIdealString(string s, int k) {
  2.         //确定dp数组
  3.         vector<int> dp(26);
  4.         int res=0;
  5.         //遍历条件
  6.         for (char c : s) {
  7.             int x = c - 'a';
  8.             int t = 0;
  9.             for (int y = 0; y < 26; y++if (abs(x - y) <= k) t = max(t, dp[y] + 1);
  10.             dp[x] = max(dp[x], t);
  11.             res=max(res,dp[x]);
  12.         }
  13.         return res;
  14.     }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/182470
推荐阅读
相关标签
  

闽ICP备14008679号