[LeetCode By Python] 15. 3Sum

一、題目

3Sum

二、解題

使用三重循環遍歷進行判斷,得出的結果使用sort進行排序,判斷是否在列表之內再添加。

三、嘗試與結果

1)首次嘗試

class Solution(object):
    def threeSum(self, nums):
        length = len(nums)
        resultList = []
        for i in range(0,length):
            for j in range(i+1,length):
                for k in range(j+1,length):
                    tSum = nums[i] + nums[j] + nums[k]
                    if tSum == 0:
                        result = []
                        result.append(nums[i])
                        result.append(nums[j])
                        result.append(nums[k])
                        result.sort()
                        if result not in resultList:
                            resultList.append(result)
        return resultList

結果:TL

2)再次嘗試,先進行sort排序,在三重循環中加入break判斷,當大于0時就跳出。

class Solution(object):
    def threeSum(self, nums):
        length = len(nums)
        resultList = []
        nums.sort()
        for i in range(0,length-2):
            if nums[i] > 0: 
                break
            for j in range(i+1,length-1):
                if nums[i] + nums[j] > 0:
                    break
                for k in range(j+1,length):
                    if nums[i] + nums[j] + nums[k] == 0:
                        result = []
                        result.append(nums[i])
                        result.append(nums[j])
                        result.append(nums[k])
                        if result not in resultList:
                            resultList.append(result)
                    if nums[i] + nums[j] + nums[k] > 0:
                        break
        return resultList

結果:TL

3)O(n3)的時間復雜度經過修改也沒啥用,改成:

  • 固定i,j、k為雙向指針,j從頭開始,k從尾開始遍歷。
  • 當和小于0時,j減1,當和大于0時,k加1
  • 當找到一個值時,不能當做此時i的固定結果,因為可能有多個,所以需要再把j、k其中之一改變,j加1或者k減1都可以
class Solution(object):
    def threeSum(self, nums):
        length = len(nums)
        resultList = []
        nums.sort()
        for i in range(0,length-2):
            j = i + 1
            k = length - 1
            while (j < k):
                sum0 = nums[i] + nums[j] + nums[k]
                if (sum0 == 0):
                    result = []
                    result.append(nums[i])
                    result.append(nums[j])
                    result.append(nums[k])
                    if result not in resultList:
                        resultList.append(result)
                    j +=1
                if (sum0 < 0):
                    j +=1
                if (sum0 > 0):
                    k -=1
        return resultList

結果:AC

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容