• 二分法


    NC32 求平方根

    题目描述

    实现函数 int sqrt(int x).
    计算并返回x的平方根(向下取整)

    示例1

    输入--2

    返回值--1

     1 #
     2 # 
     3 # @param x int整型 
     4 # @return int整型
     5 #
     6 class Solution:
     7     def sqrt(self , x ):
     8         # write code here
     9         if x <= 1:
    10             return x
    11         left = 1
    12         right = x
    13         while left <= right:
    14             mid = left + (right - left) // 2
    15             if mid*mid > x:
    16                 right = mid - 1
    17             elif mid*mid < x:
    18                 left = mid + 1
    19             else:
    20                 return mid
    21             
    22         return right
    View Code

    NC36 在两个长度相等的排序数组中找到上中位数

    给定两个有序数组arr1和arr2,已知两个数组的长度都为N,求两个数组中所有数的上中位数。上中位数:假设递增序列长度为n,若n为奇数,则上中位数为第n/2+1个数;否则为第n/2个数[要求]时间复杂度为O(logN),额外空间复杂度为O(1)
    示例1

    输入-[1,2,3,4],[3,4,5,6]

    返回值-3

    说明-总共有8个数,上中位数是第4小的数,所以返回3。 

    示例2

    输入-[0,1,2],[3,4,5]

    返回值-2

    说明-总共有6个数,那么上中位数是第3小的数,所以返回2

    看到时间复杂度为O(logN),很容易想到二分查找。过程如下:

    1. 如果每个数组中只有一个元素,较小的那个元素就是整体的上中位数,如果两个元素相等,随便返回哪个都可以。

    2. 如果数组中不止一个元素,找到两个数组的中间位置mid1和mid2。

    3. 如果arr1[mid1] == arr2[mid2],不管每个数组中元素的个数是奇数还是偶数,这两个数都可以是整体的上中位数,返回其中一个就可以。

    4. 如果arr1[mid1] > arr2[mid2],每个数组的个数是奇数的情况下:数组arr1中mid1位置以后的数都不可能是整体的上中位数,数组arr2中mid2位置以前的数都不可能是整体的上中位数。所以现在只需要考虑arr1[left1…mid1]、arr2[mid2…right],这两部分的元素个数相同,它们的上中位数就是整体的上中位数。

    5. 如果arr1[mid1] > arr2[mid2],每个数组的个数是偶数的情况下:数组arr1中mid1位置以后的数都不可能是整体的上中位数,数组arr2中mid2位置以后包括mid2位置,都不可能是整体的上中位数。所以现在只需要考虑arr1[left1…mid1]、arr2[mid2+1…right],这两部分的元素个数相同,它们的上中位数就是整体的上中位数。

    6. arr1[mid1] < arr2[mid2]的情况,分析同上。

     1 #
     2 # find median in two sorted array
     3 # @param arr1 int整型一维数组 the array1
     4 # @param arr2 int整型一维数组 the array2
     5 # @return int整型
     6 #
     7 class Solution:
     8     def findMedianinTwoSortedAray(self , arr1 , arr2 ):
     9         # write code here
    10 #         if not arr1:
    11             
    12         arr1_len = len(arr1)
    13         left1, right1 = 0, arr1_len - 1
    14         left2, right2 = 0, arr1_len -1
    15         
    16         
    17         while left1 < right1:
    18             mid1 = (left1 + right1) // 2
    19             mid2 = (left2 + right2) // 2
    20             
    21             k = right1 - left1 + 1
    22             
    23             if arr1[mid1] == arr2[mid2]:
    24                 return arr1[mid1]
    25                     
    26             elif arr1[mid1] < arr2[mid2]:
    27                 if k % 2 == 0:
    28                     left1 = mid1 + 1
    29                     right2 = mid2
    30                 else:
    31                     left1 = mid1
    32                     right2 = mid2
    33                     
    34             elif arr1[mid1] > arr2[mid2]:
    35                 if k % 2 == 0:
    36                     right1 = mid1
    37                     left2 = mid2 + 1
    38                 else:
    39                     right1 = mid1
    40                     left2 = mid2
    41                     
    42         return min(arr1[left1], arr2[left2])
    43                 
    View Code

     NC 86 矩阵元素查找

    题目描述

    已知int一个有序矩阵mat,同时给定矩阵的大小nm以及需要查找的元素x,且矩阵的行和列都是从小到大有序的。设计查找算法返回所查找元素的二元数组,代表该元素的行号和列号(均从零开始)。保证元素互异。

    示例1

    输入--[[1,2,3],[4,5,6]],2,3,6

    返回值--[1,2]

     1 # -*- coding:utf-8 -*-
     2 
     3 class Solution:
     4     def findElement(self, mat, n, m, x):
     5         # write code here
     6         i, j = 0, m-1
     7         while 0 <= i < n and 0 <= j < m:
     8             if mat[i][j] == x:
     9                 return [i, j]
    10             if mat[i][j] < x:
    11                 i += 1
    12             else:
    13                 j -= 1
    14         return [-1, -1]
    View Code
  • 相关阅读:
    五、异步任务编排CompletableFuture
    四、fork/join框架
    三、阻塞等待异步结果FutureTask
    二、synchronized同步锁
    一、Java多线程基础
    6. ZigZag Conversion (字符串的连接)
    5. Longest Palindromic Substring (DP)
    4. Median of Two Sorted Arrays (二分法;递归的结束条件)
    3. Longest Substring Without Repeating Characters (ASCII码128个,建立哈西表)
    2. Add Two Numbers
  • 原文地址:https://www.cnblogs.com/dede-0119/p/14405480.html
Copyright © 2020-2023  润新知