參考資料來源靈神在力扣所發的題單,僅供分享學習筆記和記錄,無商業用途。
核心思路:
一:直接直接用數據結構記錄需要的數據,在枚舉右,維護左的循環中,刪除當前位置的元素即可達成一樣效果
二:(采用后綴表or其他:從后往前維護最有可能滿足條件的數據結構 ),在枚舉右,維護左。
應用場景:問題有三個下標,需要滿足?0≤i<j<k<n。枚舉?j,那么?i?和?k?自動被?j?隔開,互相獨立,后續計算中無需關心?i?和?k?的位置關系。
模板題:2909. 元素和最小的山形三元組 II
class Solution {
public:int minimumSum(vector<int>& nums) {vector<int> ans(nums.size());ans[nums.size()-1]=nums.back();//后綴表:維護最有可能滿足條件的數據for(int i=nums.size()-2;i>=2;i--) ans[i]=min(ans[i+1],nums[i]);int buff=nums[0],ret=INT_MAX;//枚舉右,維護左for(int i=1;i<nums.size()-1;i++){//根據維護的左區間和后區間,判斷當前元素是否滿足條件if(buff<nums[i] && nums[i]>ans[i+1]) ret=min(ret,buff+nums[i]+ans[i+1]);buff=min(buff,nums[i]);}return ret==INT_MAX?-1:ret;}
};
力扣題單練習(靈神題單中摘取題目)
3583. 統計特殊三元組
class Solution {
public:int specialTriplets(vector<int>& nums) {const int MOD=1E9+7;unordered_map<int,int> map;vector<int> ans(nums.size(),0);int ret=0;//后綴表:從后往前維護當前元素右側有多少滿足條件的值for(int i=nums.size()-1;i>=1;i--){ans[i]=map[nums[i]*2];map[nums[i]]++;}map.clear();map[nums[0]]++;//枚舉右,維護左。for(int i=1;i<nums.size()-1;i++){//當前元素前面滿足條件的值的數量*后綴表[i]=當前元素可以構成的特殊三元組數量ret=(ret+(long long)ans[i]*map[nums[i]*2])%MOD;map[nums[i]]++;}return ret;}
};
1930. 長度為 3 的不同回文子序列
核心思路:用位運算將字符轉化成二進制記錄以當前元素作為中間值的各種不同回文序列
class Solution {
public://統計以當前元素為中間值可組成的不同回文序列的數量int check(int x){int ans=0;for(int i=0;i<26;i++) if((x>>i) & 1) ans++;return ans;}用位運算將字符轉化成二進制記錄以當前元素作為中間值的各種不同回文序列int countPalindromicSubsequence(string s) {//題意:給定一個字符串,選取從中選取三個元素要求組成回文字符串。記錄不同回文字符串的總數量vector<int> last(26,0),head(26,0),has(26,0);//數組記錄后續元素for(int i=1;i<s.size();i++) last[s[i]-'a']++;for(int i=1;i<s.size()-1;i++){last[s[i]-'a']--; //在后序元素數組中剔除當前元素head[s[i-1]-'a']++; //前序元素數組中增加當前位置的前一位的元素for(int j=0;j<26;j++){if(head[j] && last[j]){ //前后序都有的元素可組成回文序列has[s[i]-'a']|=1<<j; //記錄以當前元素作為中間值的各種不同回文序列}}}int ret=0;for(int i=0;i<26;i++) ret+=check(has[i]);return ret;}
};
3128. 直角三角形
核心思路:枚舉直角三角形的拐角位置
class Solution {
public:long long numberOfRightTriangles(vector<vector<int>>& grid) {vector<int> row(grid.size()),col(grid[0].size());//記錄每行每列有多少個1for(int i=0;i<grid.size();i++){for(int j=0;j<grid[i].size();j++){if(grid[i][j]==1){row[i]++;col[j]++;}}}long long ret=0;for(int i=0;i<grid.size();i++){for(int j=0;j<grid[0].size();j++){//枚舉直角三角形的拐角位置,當前行-1*當前列-1=當前拐角可構成的直角三角形if(grid[i][j]==1) ret+=(row[i]-1)*(col[j]-1);}}return ret;}
};
2874. 有序三元組中的最大值 II
class Solution {
public:long long maximumTripletValue(vector<int>& nums) {int n=nums.size();vector<int> ans(n+1,INT_MIN);//后綴表:從后向前維護當前最大值for(int i=n-1;i>=2;i--) ans[i]=max(ans[i+1],nums[i]);int buff=nums[0];long long ret=0;//枚舉右,維護左(最大值)for(int i=1;i<n-1;i++){ret=max(ret,(long long)(buff-nums[i])*ans[i+1]);buff=max(buff,nums[i]);}return ret;}
};