leetcode刷題(一)

weixin_46983328發表於2020-11-30

leetcode刷題總結一
1.TWO SUM
題目描述:Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

You can return the answer in any order.

思路分析1(我的思路):在給定的元素裡,兩次遍歷,第一輪選定一個元素,第二輪在剩下的元素中找尋是否有與它相加等於目標值的元素
程式碼

class Solution:
    def twoSum(self, nums: List[int], target: int): 
        length = len(nums)
        result = []
        for i in range(length):
            for j in range(i,length):
                if i == j:
                    continue
                if nums[j]+nums[i] == target:
                    result = [i,j]
                    break
        return result

我 的 解 法 是 沒 啥 含 量 的 暴 力 破 解 法 , 時 間 復 雜 度 為 O ( n 2 ) 我 的解法是沒啥含量的暴力破解法,時間複雜度為O(n^{2}) O(n2)

思路分析2(字典解法)
第二種解法是用python中資料結構字典(雜湊表)實現的,想法是
首先將第一個元素的下標為值,大小為鍵存入字典中,然後向後遍歷,用目標值減去遍歷到的元素,如果發現結果不在字典中,就將遍歷到的元素和它的下標存入字典中,如果發現表中已有該元素,就輸入它們的下標
程式碼

class Solution:
    def twoSum(self, nums: List[int], target: int): 
        length = len(nums)
        store = dict()
        store[nums[0]] = 0
        for i in range(1,length):
            if target - nums[i] in store:
                return [store.get(target-nums[i]),i]
            else:
                store[nums[i]] = i
        return 0

2.Reverse Intergers
題目描述
Given a 32-bit signed integer, reverse digits of an integer.

Note:
Assume we are dealing with an environment that could only store integers within the 32-bit signed integer range: [−231, 231 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.

思路分析: 這道題要實現將整數翻轉,例如123輸出321,-123輸出-321,0輸出0,120輸出21,同時整數大小的範圍控制在32位
首先考慮特殊情況,如果提供的x超出了範圍,直接將函式返回0表示溢位。如果x = 0,同樣直接返回0
接下來開始是一般情況
對於一個整數,要得到它的某一分位數的公式為 m o d ( x / / 1 0 i − 1 , 10 ) mod(x//10^{i-1},10) mod(x//10i1,10)
其中//表示做除法後向0取整,例如123要得除10(百分位i取2)後向0取整得到12,12再除10取餘得到2,這樣就得到了百分位數,到這裡完成了提取位數的演算法。

注意的是,提取完位數後要設定一個條件來判斷數字已經提取完,我使用的是while True迴圈,也就是不到這個條件就一直提取。觀察一下,對123來說,當i=4,也就是提取完百分位要提取千分位時,123//1000 = 0 .也就是說,當做向0取整的結果為0的時候,就可以退出迴圈了

最後還有一種情況,就是輸入為負數的時候,我們只要將負數轉為正數,再設定一個標籤記錄一下這個操作,最後利用if判斷輸出負數即可
到此程式結束
程式碼

class Solution:
    def reverse(self,x:int):
        flag = 0
        if x < 0:
            x = -x 
            flag = 1
        if x == 0:
            return 0
        if 2**31-1<x or x < -2**31:
            return 0
        result = []
        i = 0
        while True:
            rem = x // 10**i % 10
            judge = x // 10**i
            i = i + 1
            if judge == 0:
                break
            result.append(rem)
        length = len(result)
        if result[0] == 0 :
            result.remove(result[0])
            length = length - 1
        rev = ""
        for i in range(length):
            rev = rev + str(result[i])
        if flag == 1:
            a =  -int(rev)
        else:
            a = int(rev)
        if 2**31-1 < a or a < -2**31:
            return 0
        return a

3.Largest Perimeter Triangle
題目描述

Given an array A of positive lengths, return the largest perimeter of a triangle with non-zero area, formed from 3 of these lengths.

If it is impossible to form any triangle of non-zero area, return 0.
思路分析:
首先可以證明,在給定的序列中取到最大邊長的一定為相鄰的三個元素,證明如下
假 設 a , b , c 為 一 個 序 列 中 的 最 優 解 , 且 存 在 a ≤ a ′ ≤ b ≤ b ′ ≤ c , 也 就 是 存 在 a , b , c 不 相 鄰 那 麼 顯 然 a ′ , b , c 為 另 一 最 優 解 , 矛 盾 , 所 以 a 與 b 之 間 沒 有 相 鄰 元 素 同 理 可 得 , a , b , c 三 者 相 鄰 假設a,b,c為一個序列中的最優解,且存在a\leq{a'}\leq b\leq{b}'\leq{c},也就是存在a,b,c不相鄰\\ 那麼顯然a',b,c為另一最優解,矛盾,所以a與b之間沒有相鄰元素\\ 同理可得,a,b,c三者相鄰 a,b,caabbc,a,b,ca,b,cab,a,b,c
有了上面的基礎,再加上能構成三角形三邊的充要條件是任意兩邊之和大於第三邊,此題通過一個遍歷就可以得到解決
為了使程式碼得到一點優化,我將輸入的序列進行了排序,並且從最大的一邊開始遍歷
程式碼

class Solution:
    def largestPerimeter(self, A: List[int]) :
        length = len(A)
        A = sorted(A)
        for i in range(length-1,1,-1):
            a = A[i]
            b = A[i-1]
            c = A[i-2]
            if (c+b>a):
                return a+b+c
            else:
                continue
        return 0

這兩天忙裡偷閒做的三道題就總結完了,再接再勵

相關文章