求局部数组最大值、局部矩阵最大值
一、求数组局部最大值
func findMax(nums []int) int{//只能从nums里面随机找到一个符合局部最大的数字 le:=0;ri:=len(nums)-1 for le<ri{ mid:=(le+ri)/2 if nums[mid]>nums[mid+1]{ ri=mid }else{//包括小于等于的情况 le=mid+1 } } return nums[le] } func main(){ fmt.Println(findMax([]int{3,5,1,2,6,1,1})) }
二、求矩阵局部最大值
时间复杂度:nlong(n)
思路:遍历每一行+二分
func getMutexMax(nums [][]int) [][]int{ row:=len(nums);col:=len(nums[0]) ans:=make([][]int,0) for i:=0;i<row;i++{ le:=0;ri:=col-1 isFind:=false for le<ri{ mid:=(le+ri)/2 if nums[i][mid]>nums[i][mid+1]{ ri=mid }else if nums[i][mid]>nums[i][mid+1]&&nums[i][mid]>nums[i][mid-1]{ ////注意,相邻元素相等的情况不算极大值 le=mid isFind=true break }else{ le=mid+1 } } if !isFind{ continue } tmp:=[]int{nums[i][le],i,le} if row==1{//矩阵只有一行 ans=append(ans,tmp) }else if i==0 {//当前是第一行 if nums[i][le]>nums[i+1][le]{ //注意,相邻元素相等的情况不算极大值 ans=append(ans,tmp) } }else if i==row-1{//是最后一行 if nums[i][le]>nums[i-1][le]{ ans=append(ans,tmp) } }else { if nums[i-1][le]<nums[i][le]&&nums[i][le]>nums[i+1][le]{ ans=append(ans,tmp) } } } return ans } func main(){ var n,m,x int nums:=make([][]int,0) fmt.Scanf("%v %v",&n,&m) for i:=0;i<n;i++{ tmp:=make([]int,m) for j:=0;j<m;j++{ fmt.Scanf("%v",&x) tmp[j]=x } nums=append(nums,tmp) } //fmt.Println(nums) fmt.Println(getMutexMax(nums)) //fmt.Println(findMax([]int{9,3,9,9,1})) }
等风起的那一天,我已准备好一切