LeetCode Array算法题(Easy级别)整理 Part 2

本篇整理的为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
点赞