day5 查找算法|剑指 Offer 04. 二维数组中的查找|剑指 Offer 11. 旋转数组的最小数字|剑指 Offer 50. 第一个只出现一次的字符

剑指 Offer 04. 二维数组中的查找

// 思路1暴力
// 思路2二分查找
// 思路3右上角来看是二叉搜索树
// 这里答案是思路2
func findNumberIn2DArray(matrix [][]int, target int) bool {
    if len(matrix) == 0 {
        return false
    }
    m,n := len(matrix), len(matrix[0])
    shortDim := min(m,n)
    for i:=0;i<shortDim;i++{
        findRow := bsRow(matrix,i,target)
        findCol := bsCol(matrix,i,target)
        if findRow || findCol {
            return true
        }
    }
    return false
}
func bsRow(matrix [][]int, row, target int) bool {
    l, r := row, len(matrix[0])-1
    for l < r {
        mid := l+(r-l)/2
        if matrix[row][mid] == target {
            return true
        } else if matrix[row][mid] < target {
            l = mid + 1 
        } else if matrix[row][mid] > target {
            r = mid - 1
        }
    }
    if matrix[row][l] == target {
        return true
    }
    return false
}
func bsCol(matrix [][]int, col, target int) bool {
    l, r := col, len(matrix)-1
    for l < r {
        mid := l+(r-l)/2
        if matrix[mid][col] == target {
            return true
        } else if matrix[mid][col] < target {
            l = mid + 1
        } else if matrix[mid][col] > target {
            r = mid - 1
        }
    }
    if matrix[l][col] == target {
        return true
    }
    return false
}
func min(a,b int) int {
    if a < b {
        return a 
    }
    return b 
}

剑指 Offer 11. 旋转数组的最小数字

// 思路1,遍历一遍找最小值。
// 但显然题目不是要我们这样做。

// 思路2:二分查找,略难,要证明
func minArray(numbers []int) int {
    // 二分法分治,通过右值与中值比较
    n := len(numbers)
    l, r := 0, n-1
    for l < r {
		// 分三种case
        mid := l+(r-l)/2
		// 1.中值大于右值,如[3 4 5 1 2],最小值一定在右部,所以更新左部
        if numbers[mid] > numbers[r] {
            l = mid + 1 
		// 2.中值小于右值,右值一定不是最小值,最小值可能在左部,更新右部
        } else if numbers[mid] < numbers[r] {
            r = mid 
		// 3.中值等于右值,题中说可能有重复的值出现,此case right--
        } else if numbers[mid] == numbers[r] {
            r--
        }
    }
    return numbers[l]
}

剑指 Offer 50. 第一个只出现一次的字符

func firstUniqChar(s string) byte {
    var res [26]int
    for i:=0;i<len(s);i++{
        res[s[i]-'a']++ 
    }
    for i:=0;i<len(s);i++{
    if res[s[i]-'a']==1{ //这里千万不能写成res[i]==1,因为res前面的元素顺序对应为abcd,他们的值可能为1但是不一定是在s中第一个出现一次的字符
            return s[i]
        }
    }
    return ' '
} 
func firstUniqChar(s string) byte {
    var ans [26]int
    for _, v := range s {
        ans[v - 'a']++
    }
    for _, v := range s {
        if ans[v-'a'] == 1 {
            return byte(v)
        }
    }
    return ' '
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值