1. 程式人生 > >leetcode 騰訊 2018 秋招精選(50 題)Easy Part (3)

leetcode 騰訊 2018 秋招精選(50 題)Easy Part (3)

21. 合併兩個有序連結串列

將兩個有序連結串列合併為一個新的有序連結串列並返回。新連結串列是通過拼接給定的兩個連結串列的所有節點組成的。 

示例:

輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4

思路:使用遞迴遍歷兩個連結串列,小的數放在前面(有序連結串列),需要注意的是返回的值是一個連結串列。

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def mergeTwoLists(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        if not l1:
            return l2
        if not l2:
            return l1
        # 初始值為0
        res = ListNode(0)
        if l1.val < l2.val:
            # 小的值做頭
            res.val = l1.val
            res.next = self.mergeTwoLists(l1.next, l2)
        else:
            res.val = l2.val
            res.next = self.mergeTwoLists(l1, l2.next)
        return res

122. 買賣股票的最佳時機 II

給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。

設計一個演算法來計算你所能獲取的最大利潤。你可以儘可能地完成更多的交易(多次買賣一支股票)。

注意:你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。

示例 1:

輸入: [7,1,5,3,6,4]
輸出: 7
解釋: 在第 2 天(股票價格 = 1)的時候買入,在第 3 天(股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5-1 = 4 。
     隨後,在第 4 天(股票價格 = 3)的時候買入,在第 5 天(股票價格 = 6)的時候賣出, 這筆交易所能獲得利潤 = 6-3 = 3 。

示例 2:

輸入: [1,2,3,4,5]
輸出: 4
解釋: 在第 1 天(股票價格 = 1)的時候買入,在第 5 天 (股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5-1 = 4 。
     注意你不能在第 1 天和第 2 天接連購買股票,之後再將它們賣出。
     因為這樣屬於同時參與了多筆交易,你必須在再次購買前出售掉之前的股票。

示例 3:

輸入: [7,6,4,3,1]
輸出: 0
解釋: 在這種情況下, 沒有交易完成, 所以最大利潤為 0。

思路:貪心演算法。每一次都取後一個值和前值最大差值進行累加運算。

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        res = 0
        if not prices:
            return 0
        if len(prices) < 2:
            return 0
        for i in range(1, len(prices)):
            res += max(0, prices[i] - prices[i - 1])
        return res

155. 最小棧

設計一個支援 push,pop,top 操作,並能在常數時間內檢索到最小元素的棧。

  • push(x) -- 將元素 x 推入棧中。
  • pop() -- 刪除棧頂的元素。
  • top() -- 獲取棧頂元素。
  • getMin() -- 檢索棧中的最小元素。

示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.

思路:設定一個普通棧和一個最小值棧,最小值棧只儲存最小值,從而達到常數時間檢索最小值。

class MinStack(object):

    def __init__(self):
        """
        initialize your data structure here.
        """
        self.stack = []
        self.stackMin = []
    
    def push(self, x):
        """
        :type x: int
        :rtype: void
        """
        self.stack.append(x)
        # 最小棧新增需要有先驗條件,保證新增的是最小值
        if self.stackMin == [] or x < self.getMin():
            self.stackMin.append(x)
        else:
            self.stackMin.append(self.getMin())
    
    def pop(self):
        """
        :rtype: void
        """
        if self.stack == [] or self.stackMin == []:
            return None
        self.stack.pop()
        self.stackMin.pop()
    
    def top(self):
        """
        :rtype: int
        """
        return self.stack[-1]

    def getMin(self):
        """
        :rtype: int
        """
        return self.stackMin[-1]

121. 買賣股票的最佳時機

給定一個數組,它的第 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。
# -*- coding:utf-8 -*-
"""
如果在第i天賣出股票,那麼我們在那一天買入股票會使利潤最大?
答案是前i-1天中股票價格最低的那一天。一次遍歷就可以解決這
個問題了。用一個變數minPrice表示前i-1天的最低股票價格,
用當前的股票價格減去minPrice就是在本天賣出的最低收益了,
再根據是否超過記錄的最大收益maxProfit來確認最大收益。
"""
class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        res = 0
        if not prices:
            return 0
        if len(prices) < 2:
            return 0
        minPrice = prices[0]
        for i in range(1, len(prices)):
            res = max(prices[i] - minPrice, res)
            if prices[i] < minPrice:
                minPrice = prices[i]
        return res

217. 存在重複元素

給定一個整數陣列,判斷是否存在重複元素。

如果任何值在陣列中出現至少兩次,函式返回 true。如果陣列中每個元素都不相同,則返回 false。

示例 1:

輸入: [1,2,3,1]
輸出: true

示例 2:

輸入: [1,2,3,4]
輸出: false

示例 3:

輸入: [1,1,1,3,3,4,3,2,4,2]
輸出: true
class Solution(object):
    def containsDuplicate(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """
        if len(nums) <= 1:
            return False
        nums.sort()
        first = nums[0]
        for i in range(len(nums)):
            if nums[i] == first:
                return True
            first = nums[i]
        return False