一、題目
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