本篇整理的为Array算法题(Easy级别)的第二部分,这些题对我而言更有启发性,提高了思维的灵活性。如有纰漏,敬请指出,也欢迎交流分享更好的算法~。
1. Two Sum
题目简介:给定一串数(nums)和一个目标数(target),要求找出nums中相加之和为target的两个数的下标。nums中有且仅有一对满足的数,并且用同一个数两次。
解题思路:利用字典,对nums中的数(假设当前数为n)依次进行判断,若target-n在字典中,说明n和target-n就是满足条件的两个数。代码如下(最多一轮遍历即可得出结果):
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
d = {}
for i in xrange(len(nums)):
t = target - nums[i]
if d.has_key(t):
return [d.get(t),i]
d[nums[i]] = i
121. Best Time to Buy and Sell Stock
题目简介:给定一串数字prices,代表某股票在各日的价格,若你最多能进行一次交易(买进一次卖出一次),求最大收益。
解题思路:一轮遍历,依次判断当前价格是否为历史最低价格,如果是,则更新最低价格,否则,计算当前价格与历史最低价格之差,表示依次买进卖出所得收益,并判断该收益是否比之前大,若是,则更新。通过绘制prices的折线图,可更直观的理解该解法。代码如下:
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
l = len(prices)
if l < 2:
return 0
valleyPrice = prices[0]
profit = 0
for p in prices:
if p < valleyPrice:
valleyPrice = p
else:
t = p - valleyPrice
if t > profit:
profit = t
return profit
122. Best Time to Buy and Sell Stock II
题目简介:主题干如上题,只是用户可进行多次交易而非一次来获取收益,求最大收益。
解题思路:类似于上题,画出价格折线图,易知只要后一天的价格高于前一天,我们就可以累加差量,得到最后结果。代码如下:
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
profit = 0
for i in xrange(len(prices)-1):
profit+=max(0,prices[i+1]-prices[i])
return profit
167. Two Sum II – Input array is sorted
题目简介:同1. Two Sum,只是此时的数组已按升序排列。
解题思路:数组有序是个很重要的性质。我们可以采取从数组两端向中间聚拢的方式找到所需解。若两端的数之和小于目标数,说明左边的数应该变大;若两端的数之和大于目标数,说明右边的数过大,需要减小,即向左移动;否则,找到所需解。代码入下:
class Solution(object):
def twoSum(self, numbers, target):
"""
:type numbers: List[int]
:type target: int
:rtype: List[int]
"""
left,right = 0,len(numbers)-1
while left < right:
t = numbers[left]+numbers[right]
if t == target:
return [left+1,right+1]
elif t < target:
left+=1
else:
right-=1
169. Majority Element
题目简介:给定一串数,找出其中个数多于数组长度一半的数。题目限制:满足条件的数有且只有一个。
解题思路:先对数组排序,满足条件的数肯定处于新数组的中间位置。
class Solution(object):
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
return sorted(nums)[len(nums)/2]
268. Missing Number
题目简介:给定一串长为n的数字数组nums,其中的元素取值为0~n中的数,且无重复元素,求nums中缺失的那个数。
解题思路:如果眼睛盯死在对数组操作上,难以找到非常方便的解法。将其换算成数学问题的话,复杂度顿时下降。代码如下:
class Solution(object):
def missingNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
l = len(nums)
return l*(l+1)//2-sum(nums)
532. K-diff Pairs in an Array
题目简介:给定一串数,求数中满足相差为k的数对(i,j)的个数,(i,j)=(j,i)且不重复计数不同位置的相同元素。
解题思路:首先分类讨论k的情况。若k<0,则直接返回0;k=0,返回重复元素的个数;k>0,可通过求集合的交集来判断满足条件的数对的个数。代码如下:
import collections
class Solution(object):
def findPairs(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
if k < 0:
return 0
if not k:
return sum([v > 1 for v in collections.Counter(nums).values()])
return len(set(nums)&{n+k for n in nums})
643. Maximum Average Subarray I
题目简介:给定一串数nums和数字k,返回长为k的子串的最大平均大小。
解题思路:穷举遍历所有可能的长为k的子串,k很大时会相当耗时。所以通过滑动宽为k的窗口,通过减去前一个数和加上后一个数的操作,即可得到当前子串的大小。代码如下:
class Solution(object):
def findMaxAverage(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: float
"""
l = len(nums)
maxSum = sum(nums[:k])
t = maxSum
for i in xrange(1,l-k+1):
t = t - nums[i-1] + nums[i+k-1]
if t > maxSum:
maxSum = t
return 1.0*maxSum/k