力扣1901、找出顶峰元素Ⅱ
1、二分法(124ms,95%;45.2MB,24%)
时间复杂度:O(nlog m):m、n分别是矩阵的行数、列数
空间复杂度:O(1)
1 //max_element(r,r+6)返回数组前6个元素中的最大值的地址 2 //取值则为*max_element(r,r+6) 3 //int(返回的地址-数组头地址)即为最大值在数组的序号 4 vector<int> findPeakGrid(vectorint>>& mat) { 5 //m,n分别是矩阵的行数、列数 6 int m=mat.size(); 7 int n=mat[0].size(); 8 9 //num1,num2保存相邻三行的最上和最下两行的最大值 10 int num1=0,num2=0; 11 int left=0,right=m-1; 12 int mid=0; 13 while(left<=right){ 14 mid=(left+right)/2; 15 num1=mid==0? -1:*max_element(mat[mid-1].begin(),mat[mid-1].end()); 16 num2=mid==m-1? -1:*max_element(mat[mid+1].begin(),mat[mid+1].end()); 17 //这里num3得到的是mid这行的最大值的地址 18 auto num3=max_element(mat[mid].begin(),mat[mid].end()); 19 //如果中间那行的最大值比相邻两行的最大值还大即为目标值 20 if(*num3>=max(num1,num2)) 21 return {mid,int(num3-mat[mid].begin())}; 22 //每次只需用相邻三行比较,不断比较不断排除即可 23 else if(num1>=max(*num3,num2)) 24 right=mid-1; 25 else 26 left=mid+1; 27 } 28 return {}; 29 }