求局部数组最大值、局部矩阵最大值

一、求数组局部最大值

 

 

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}))
}

 

posted @ 2022-07-08 14:43  知道了呀~  阅读(203)  评论(0编辑  收藏  举报