给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
输入: [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
def maxProfit(self, prices: List[int]) -> int:
"""
LeeTCode:自己的方案
思路:想要获利肯定后一天要比前一天收入多。
执行用时:76 ms
内存消耗:15 MB
"""
profit = 0
if len(prices) == 0:
return 0
for i in range(len(prices)-1):
if prices[i] < prices[i+1]:
profit += (prices[i+1] - prices[i])
pass
return profit
这里我们可以采用贪心策略来解决:首先我们需要理解一点,第i天买入,第j天卖出得到的收益和第i天买入,第i+p天卖出,第i+p+1
天再买入,第j天卖出得到的收益是相同的。比如[1,2,3,4,5],很明显我们知道最大收益是4,可以看作是第一天买入,第五天卖出,
但是也可以看作是第1天买入,第二天卖出,同时买入,第三天又卖出,同时买入······
给定一个整数数组,判断是否存在重复元素。
如果任意一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。
输入: [1,2,3,1]
输出: true
输入: [1,1,1,3,3,4,3,2,4,2]
输出: true
输入: [1,2,3,4]
输出: false
def containsDuplicate(self, nums: List[int]) -> bool:
"""
LeeTCode:自己的方案
思路:先排序,排序后重复元素相邻。
执行用时:56 ms
内存消耗:16.9 MB
"""
nums.sort()
for i in range(1, len(nums)):
if nums[i] == nums[i-1]:
return True
return False
一: 将无序数组先进行排序,然后判断是否有连续的数字。
二: 使用python的元组数据结构进行判断。(元组中不能出现重复的数据)
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
输入: [1,2,2,1,3]
输出: 3
输入: [1,2,2]
输出: 1
输入: [4,1,2,1,2]
输出: 4
def singleNumber(self, nums: List[int]) -> int:
nums.sort()
lens = len(nums)
if lens == 1:
return nums[0]
if nums[1] != nums[0]:
return nums[0]
for i in range(1, lens, 2):
if nums[i] != nums[i-1]:
return nums[i-1]
return nums[lens-1]
一: 将无序数组先进行排序,然后判断是否有连续的数字,在遍历数组时一次进两位。
二: 使用python的异或运算。(0^num = num / num ^ num = 0 /n ^ m = m -n)
给定两个数组,编写一个函数来计算它们的交集。
说明:
输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
我们可以不考虑输出结果的顺序。
进阶:
如果给定的数组已经排好序呢?你将如何优化你的算法?
如果 nums1 的大小比 nums2 小很多,哪种方法更优?
如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2,2]
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4,9]
def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
list_add = []
num1 = set(nums1)
num2 = set(nums2)
for i in num1:
if i in num2:
count = min(nums1.count(i), nums2.count(i))
for j in range(count):
list_add.append(i)
return list_add
一: 将无序数组先进行排序,然后逐个判断是左右数组的大小,从而找到相同的值。
二: 使用python的元组数据结构进行判断,利用元组结构找出重复的值,再用列表统计值的个数。(元组中不能出现重复的数据)
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
def plusOne(self, digits: List[int]) -> List[int]:
"""
LeeTCode:自己的方案
思路:将列表转为整型数字,然后加一在转会列表。
执行用时:36 ms
内存消耗:13.9 MB
"""
lens = len(digits)
data = []
num = 0
for i in range(lens):
num = (num * 10) + digits[i]
num += 1
while num != 0:
data.append(num % 10)
num = num // 10
data.reverse()
return data
一:
二:
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
def plusOne(self, digits: List[int]) -> List[int]:
"""
LeeTCode:自己的方案
思路:将列表转为整型数字,然后加一在转会列表。
执行用时:36 ms
内存消耗:13.9 MB
"""
lens = len(digits)
data = []
num = 0
for i in range(lens):
num = (num * 10) + digits[i]
num += 1
while num != 0:
data.append(num % 10)
num = num // 10
data.reverse()
return data
一:
二: