69.x的平方根
给你一个非负整数 x
,计算并返回 x
的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5)
或者 x ** 0.5
。
示例 1:
输入:x = 4 输出:2
示例 2:
输入:x = 8 输出:2 解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
方法一:暴力破解
当x=0或1时直接返回
从i=2开始,当i的平方>=x了则停止
class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
"""
if x == 0 or x == 1:
return x
i = 2
while i * i < x:
i += 1
if i * i == x:
return i
else:
return i-1
方法二:二分查找
将可找的值范围定在[0,x],每次与mid做比较,最后left所处位置的值一定是平方大于x的第一个值
注意:mid = (r-l)//2+l
class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
"""
left = 0
right = x
while left <= right:
mid = (right-left) // 2 +left
if mid ** 2 == x:
return mid
if mid ** 2 > x:
right = mid - 1
else:
left = mid + 1
return left - 1
88.合并两个有序数组
给你两个按 非递减顺序 排列的整数数组 nums1
和 nums2
,另有两个整数 m
和 n
,分别表示 nums1
和 nums2
中的元素数目。
请你 合并 nums2
到 nums1
中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1
中。为了应对这种情况,nums1
的初始长度为 m + n
,其中前 m
个元素表示应合并的元素,后 n
个元素为 0
,应忽略。nums2
的长度为 n
。
示例 1:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 输出:[1,2,2,3,5,6] 解释:需要合并 [1,2,3] 和 [2,5,6] 。 合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。
示例 2:
输入:nums1 = [1], m = 1, nums2 = [], n = 0 输出:[1] 解释:需要合并 [1] 和 [] 。 合并结果是 [1] 。
示例 3:
输入:nums1 = [0], m = 0, nums2 = [1], n = 1 输出:[1] 解释:需要合并的数组是 [] 和 [1] 。 合并结果是 [1] 。 注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。
思考:一般两个有序数组合并会想到归并排序
1.可以从前往后比大小,也可从后往前,此题中nums1后部为空,从后往前比大小移动数据较少
2.当m>0且n>0时,比较两数组末尾的数的大小,定义一个k值代表当前能放的最后的位置
k初始为m+n-1
当nums1[m-1]>nums2[n-1],nums1[k]=nums1[m-1],此时,nums1内有一个数据被安置,则m-1
否则,nums1[k]=nums2[n-1],此时,nums2内有一个数据被安置,则n-1
每当有一个数据被安置则k-1
3.最终当某个数组内的数被安置完循环完成,若m!=0则不动,若n!=0则将nums2内的剩余的最小数据复制到nums1中 nums1[:n]=nums2[:n]
class Solution(object):
def merge(self, nums1, m, nums2, n):
"""
:type nums1: List[int]
:type m: int
:type nums2: List[int]
:type n: int
:rtype: None Do not return anything, modify nums1 in-place instead.
"""
k = m + n - 1
while m > 0 and n > 0:
if nums1[m-1] > nums2[n-1]:
nums1[k] = nums1[m-1]
m -= 1
else:
nums1[k] = nums2[n-1]
n -= 1
k -= 1
nums1[:n] = nums2[:n]
return nums1