leetcode53. 最大子序和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
思路:
1、标识前面的累加和和最大值
2、判断累加和以及最大值的处理
代码如下:
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
stmp=nums[0]
smax=nums[0]
for i in range(1,len(nums)):
if stmp>0:
stmp=stmp+nums[i]
smax=max(stmp,smax)
else:
stmp=nums[i]
smax=max(stmp,smax)
return smax
leetcode121. 买卖股票的最佳时机
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。
注意:你不能在买入股票前卖出股票。
示例 1:
输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
示例 2:
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
思路:
本质上求序列的最小值和当前值的差值,取最大,默认值为0
代码如下:
class Solution:
def maxProfit(self, prices: List[int]) -> int:
if len(prices)==0:
return 0
smax=0
min1=prices[0]
for i in range(1,len(prices)):
min1=min(min1,prices[i])
smax=max(smax,prices[i]-min1)
return smax
leetcode448. 找到所有数组中消失的数字
给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。
找到所有在 [1, n] 范围之间没有出现在数组中的数字。
您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。
示例:
输入:
[4,3,2,7,8,2,3,1]
输出:
[5,6]
思路:
修改数组,讲出现过元素作为索引同时将值置为小于0的值,再判断大于0的索引为未出现过的值
代码如下:
class Solution(object):
def findDisappearedNumbers(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
result=[]
for i in range(len(nums)):
newindex=abs(nums[i])-1
if nums[newindex]>0:
nums[newindex]*=-1
for j in range(len(nums)):
if nums[j]>0:
result.append(j+1)
return result