给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
我思路:
二分查找 可用递归,也可用循环
class Solution(object):
def searchInsert(self, nums, target):
high=len(nums)-1 #high指向高处元素
if high==-1:
return 0
low=0
while True:
if high<low:#不应该是<=,因为若插入元素在数组首,返回high+1,则是1.所以应允许找不到target,target又比low还小时,high减为比low还小
return high+1
l=(high+low)/2
if nums[l]==target:
return l
if nums[l]<target:
low=l+1 #low和high一个加1,一个减1,对下一步l无影响,却能向前走一步,避免原地。如[1,2]就会原地而超时
else:
high=l-1
给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
我思路:
分治:类似基数排序,先看局部的和为正数还是负数,如果是正数,那相邻两部分合并 [未实现】
官方:
1.分治
class Solution(object):
def maxSubArray(self, nums):
f=0
s=nums[0]
for i in range(len(nums)):
f=max(nums[i],f+nums[i])#f用来记录当前位置i的最大连续和,但是不用保存,在下一步马上就用了,所以开一个空间就行了
s=max(s,f)
return s
2.贪心
从当前元素A开始,逐个吞下后面的元素,如果累加和为正(说明前面的元素和对后面的元素有帮助),在过程中记录下最大值(最大累加和)。当累加和为负,立即放弃前面所有元素(A,B,C),从当前元素D为起点,重新开始累加。(为什么不是从上一起点元素A的下一个点B开始——因为已证明上一起点元素A对其下一个点B有帮助,所以以B为起点一定不如以A为起点大,可以省去这个过程)
class Solution(object):
def maxSubArray(self, nums):
s=0
r=nums[0]
for i in range(len(nums)):
if s<0:
s=0
s=s+nums[i]
r=max(r,s)
return r
3.分治
累加和最大,分为三种情况:mid左端的段,mid右端的段,跨mid的段。比较三种选最大值。
左右两端分别递归找最大和。递归结束条件:left=right
跨mid的段又可以分治为,以mid为右端点向左延伸的最大和段,以mid+1为左端点向右延伸的最大和段,
class Solution(object):
def maxSubArray(self, nums):
left=0
right=len(nums)-1
result=self.maxsentence(left,right,nums)
return result
def maxsentence(self,left,right,nums):
if left==right:
return nums[left]
mid=(left+right)/2
#分为三段
l=self.maxsentence(left,mid,nums)
r=self.maxsentence(mid+1,right,nums)
m=self.midmax(left,mid,right,nums)
sum=max(l,r)
sum=max(sum,m)
return sum
def midmax(self,left,mid,right,nums):
i=mid
s=0
ls=nums[mid]
rs=nums[mid+1]
while i>=left:#向左递减
s=s+nums[i]
ls=max(ls,s)
i=i-1
s=0
for i in range(mid+1,right+1):
s=s+nums[i]
rs=max(rs,s)
return ls+rs