维护二维区前缀和地推即可。
至于找第kkk大,排序搞,或者利用快速选择算法。
STLSTLSTL自带了一个nth_element(first,pos,end)nth\_element(first,pos,end)nth_element(first,pos,end)
该算法复杂度是O(n)O(n)O(n)的,最坏是O(n2)O(n^2)O(n2)
所以基于该算法的总时间复杂度:O(mn)O(mn)O(mn)
code(快速选择)
class Solution {
public:int kthLargestValue(vector>& a, int k) {int n=a.size(),m=a[0].size();vector >b(n,vector(m,0));vectorans;for(int i=0;i=0) x^=b[i-1][j];if(j-1>=0) x^=b[i][j-1];if(i>=1&&j>=1) x^=b[i-1][j-1];b[i][j]=x;ans.push_back(x);}nth_element(ans.begin(),ans.begin()+k-1,ans.end(),greater());return ans[k-1];}
};
本题的思想就是 异或运算和相加运算 都具有前缀和性质。