####二分查找模板
- 边界初始化
- 循环条件
- 取中位数
- +1 取右中位数,反之左中位数
- 循环内只有两个分支
- 排除中位数逻辑
- 循环结束处理中位数相等情况
#####demo 35 二分查找
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
left = 0 ;
right = len(nums)-1
while(left<right):
mid = (left+right)>>1
#排除中位数逻辑
if(nums[mid]<target):
left = mid + 1
else:
right = mid
if(nums[left] == target):
return left
return -1
leetcode 69 x的平方根
class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
"""
left = 0
right = x//2
while(left<right):
mid = (left+right+1)>>1
if(mid*mid>x):
right = mid-1
else:
left = mid
return left
300 最长上升子序列
将 dp 数组定义为:以 nums[i] 结尾的最长上升子序列的长度那么题目要求的,就是这个 dp 数组中的最大者以数组 [10, 9, 2, 5, 3, 7, 101, 18] 为例dp 的值: 1 1 1 2 2 3 4 4
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
def lengthOfLIS(self, nums):
size = len(nums)
# 特判
if size <= 1:
return size
dp = [1] * size
for i in range(1, size):
for j in range(i):
if nums[i] > nums[j]:
# + 1 的位置不要加错了
dp[i] = max(dp[i], dp[j] + 1)
# 最后要全部一看遍,取最大值
return max(dp)