NC32 求平方根
题目描述
实现函数 int sqrt(int x).
计算并返回x的平方根(向下取整)
示例1
输入--2
返回值--1
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
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),很容易想到二分查找。过程如下:
-
如果每个数组中只有一个元素,较小的那个元素就是整体的上中位数,如果两个元素相等,随便返回哪个都可以。
-
如果数组中不止一个元素,找到两个数组的中间位置mid1和mid2。
-
如果arr1[mid1] == arr2[mid2],不管每个数组中元素的个数是奇数还是偶数,这两个数都可以是整体的上中位数,返回其中一个就可以。
-
如果arr1[mid1] > arr2[mid2],每个数组的个数是奇数的情况下:数组arr1中mid1位置以后的数都不可能是整体的上中位数,数组arr2中mid2位置以前的数都不可能是整体的上中位数。所以现在只需要考虑arr1[left1…mid1]、arr2[mid2…right],这两部分的元素个数相同,它们的上中位数就是整体的上中位数。
-
如果arr1[mid1] > arr2[mid2],每个数组的个数是偶数的情况下:数组arr1中mid1位置以后的数都不可能是整体的上中位数,数组arr2中mid2位置以后包括mid2位置,都不可能是整体的上中位数。所以现在只需要考虑arr1[left1…mid1]、arr2[mid2+1…right],这两部分的元素个数相同,它们的上中位数就是整体的上中位数。
-
arr1[mid1] < arr2[mid2]的情况,分析同上。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
NC 86 矩阵元素查找
题目描述
已知int一个有序矩阵mat,同时给定矩阵的大小n和m以及需要查找的元素x,且矩阵的行和列都是从小到大有序的。设计查找算法返回所查找元素的二元数组,代表该元素的行号和列号(均从零开始)。保证元素互异。
示例1
输入--[[1,2,3],[4,5,6]],2,3,6
返回值--[1,2]
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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]