【golang】leetcode中级-搜索旋转排序数组&搜索二维矩阵Ⅱ

wric

第一题 搜索旋转排序数组

题目

image.png

解题思路

image.png
image.png

代码

func search(nums []int, target int) int {
    //初始化边界和二分搜索的中点
    l := 0
    r := len(nums) - 1
    var mid int

    for l <= r{ 
        //取中点,如果中点为目标则直接返回
        mid = l + (r - l) / 2
        if target == nums[mid]{
            return mid
        }

        //mid至少会有一端有序,可以利用有序段收缩边界。
        if nums[mid] >= nums[l] {//左端有序
            if target < nums[mid] && target >= nums[l] { //元素在左端
                    r = mid - 1
                }else{ //排除左端
                    l = mid + 1
                }
            }else{//右端有序
                if target > nums[mid] && target <= nums[r] { //元素在右端
                    l = mid + 1
                }else{ //排除右端
                    r = mid - 1
                }
            }
    }
    return -1
}

复杂度分析

时间复杂度: O(logn),其中 n 为 nums 数组的大小。整个算法时间复杂度即为二分查找的时间复杂度 O(logn)。

空间复杂度: O(1) 。我们只需要常数级别的空间存放变量。

第二题 搜索二维矩阵Ⅱ

题目

image.png

思路

对于二维矩阵,我们可以把它看作为多个数组的聚合

且矩阵的行和列都是升序排列的

因此我们只需搜索行首元素小于等于terget的行

并且
搜索行可以直接使用上一题所提供的函数

代码

func searchMatrix(matrix [][]int, target int) bool {
    for _,v:=range matrix {
        if v[0]==target{return true}
        if v[0]<target{if search(v,target)!=-1 {return true}}
    }
    return false
}
func search(nums []int, target int) int {
    //初始化边界和二分搜索的中点
    l := 0
    r := len(nums) - 1
    var mid int

    for l <= r{
        //取中点,如果中点为目标则直接返回
        mid = l + (r - l) / 2
        if target == nums[mid]{
            return mid
        }

        //mid至少会有一端有序,可以利用有序段收缩边界。
        if nums[mid] >= nums[l] {//左端有序
            if target < nums[mid] && target >= nums[l] { //元素在左端
                r = mid - 1
            }else{ //排除左端
                l = mid + 1
            }
        }else{//右端有序
            if target > nums[mid] && target <= nums[r] { //元素在右端
                l = mid + 1
            }else{ //排除右端
                r = mid - 1
            }
        }
    }
    return -1
}

效果

image.png

复杂度分析

时间复杂度: O(nlogn),其中 n 为 matrix 矩阵的长度。每一行的时间复杂度即为二分查找的时间复杂度 O(logn), 最多需要搜索n行

空间复杂度: O(1) 。我们只需要常数级别的空间存放变量。

优化

image.png


func searchMatrix(matrix [][]int, target int) bool {
    m, n := len(matrix), len(matrix[0])
    x, y := 0, n-1
    for x < m && y >= 0 {
        if matrix[x][y] == target {
            return true
        }
        if matrix[x][y] > target {
            y--
        } else {
            x++
        }
    }
    return false
}


作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/search-a-2d-matrix-ii/solution/sou-suo-er-wei-ju-zhen-ii-by-leetcode-so-9hcx/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

效果
image.png

阅读 528
10 声望
3 粉丝
0 条评论
10 声望
3 粉丝
宣传栏