zoukankan      html  css  js  c++  java
  • [Binary Search] Leetcode 35, 74

    35. Search Insert Position

    Description

    Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.

    You may assume no duplicates in the array.

    Example 1:

    Input: [1,3,5,6], 5
    Output: 2
    

    Example 2:

    Input: [1,3,5,6], 2
    Output: 1
    

    Example 3:

    Input: [1,3,5,6], 7
    Output: 4
    

    Example 4:

    Input: [1,3,5,6], 0
    Output: 0

    Solution

    二分法查找

     1 class Solution:
     2     def searchInsert(self, nums, target):
     3         """
     4         :type nums: List[int]
     5         :type target: int
     6         :rtype: int
     7         """
     8         l, r = 0, len(nums)
     9         
    10         while l < r:
    11             m = (l + r) // 2
    12             if nums[m] == target:
    13                 return m
    14             elif nums[m] > target:
    15                 r = m
    16             else:
    17                 l = m + 1
    18         return l

    74. Search a 2D Matrix

    Description

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:

    • Integers in each row are sorted from left to right.
    • The first integer of each row is greater than the last integer of the previous row.

    Example 1:

    Input:
    matrix = [
      [1,   3,  5,  7],
      [10, 11, 16, 20],
      [23, 30, 34, 50]
    ]
    target = 3
    Output: true
    

    Example 2:

    Input:
    matrix = [
      [1,   3,  5,  7],
      [10, 11, 16, 20],
      [23, 30, 34, 50]
    ]
    target = 13
    Output: false

    Solution

    Approach 1: 二分查找

    先按行二分确定目标所在行;再在该行中确定元素位置。

     1 class Solution:
     2     def searchMatrix(self, matrix, target):
     3         """
     4         :type matrix: List[List[int]]
     5         :type target: int
     6         :rtype: bool
     7         """
     8         if not matrix or not matrix[0]: return False
     9         m, n = len(matrix), len(matrix[0])
    10         
    11         if target < matrix[0][0] or target > matrix[m - 1][n - 1]:
    12             return False
    13         
    14         start, end = 0, m
    15         while start < end:
    16             midrow = (start + end) // 2
    17             if matrix[midrow][0] == target:
    18                 return True
    19             elif target < matrix[midrow][0]:
    20                 end = midrow
    21             else: start = midrow + 1
    22         row = start - 1
    23 
    24         l, r = 0, n
    25         
    26         while l < r:
    27             midcol = (l + r) // 2
    28             if matrix[row][midcol] == target: return True
    29             elif matrix[row][midcol] < target:
    30                 l = midcol + 1
    31             else: r = midcol
    32         return False

    Beats: 41.43%
    Runtime: 48ms

    Approach 2: 从右上到左下查找

    若当前 > target, 则向前一列查找 => 则矩阵后几列均不用再考虑;
    若当前 < target, 则向下一行查找 => 则矩阵前几行均不用再考虑。

     1 class Solution:
     2     def searchMatrix(self, matrix, target):
     3         """
     4         :type matrix: List[List[int]]
     5         :type target: int
     6         :rtype: bool
     7         """
     8         if not matrix or not matrix[0]: return False
     9         
    10         rows, cols = len(matrix), len(matrix[0])
    11         row, col = 0, cols - 1
    12         while True:
    13             if row < rows and col >= 0:
    14                 if matrix[row][col] == target:
    15                     return True
    16                 elif matrix[row][col] < target:
    17                     row += 1
    18                 else: col -= 1
    19             else: return False

    Beats: 41.67%
    Runtime: 48ms



  • 相关阅读:
    学习资料(干货汇集)
    Android安全系列之:如何在native层保存关键信息
    IntelliJ IDEA 2019 快捷键终极大全,速度收藏!
    【转】45个实用的JavaScript技巧、窍门和最佳实践
    Android中jsoup的混淆规则【转】
    Android WebServer相关项目
    【转】实战nanoHTTPD嵌入android app(3)
    【.net 深呼吸】程序集的热更新
    【WCF】使用“用户名/密码”验证的合理方法
    【Win 10 应用开发】应用预启动
  • 原文地址:https://www.cnblogs.com/shiyublog/p/9667820.html
Copyright © 2011-2022 走看看