Datawhale leetcode训练营 第六天

题目描述

三数之和
在这里插入图片描述

方法一:

因为是三数之和,所以最直观的想法就是,用三个循环把,所有可能的三数之和算一遍就可以了。
第一个循环定住第一个数,然后从第二个数从左右到搜索,从最后一个数从右到左搜索。
这里借鉴老表的分析图,非常直观。

https://blog.csdn.net/qq_39241986/article/details/83062873

在这里插入图片描述

代码稍微优化了一下,特殊情况

class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        # 用一个list来储存nums中满足条件的三个数
        satisfied_list = []
        # 对nums列表进行排序
        nums.sort()
        for i in range(len(nums)):
            # 如果排序后第一个数都大于0,则肯定不会有三数之和为0的情况
            if nums[i] > 0:
                break
            # 排序后相邻两数如果相等,则跳出当前循环,因为相同的数只需要计算一次
            if i > 0 and nums[i] == nums[i-1]:
                continue
            #还剩下一种最common的情况
            if i == 0 or nums[i] > nums[i - 1]:
            # 记录i的下一个位置
            left_number = i + 1
            # 最后一个元素的位置
            right_number = len(nums) - 1
            while left_number < right_number:
                # 判断三数之和是否为0
                if nums[i]+nums[left_number] + nums[right_number] == 0:
                    # 把结果加入数组中
                    satisfied_list.append([nums[i], nums[left_number], nums[right_number]])
                    # 判断left_number相邻数字有没有相等的,有的话就不需要重复计算
                    while left_number < right_number and nums[left_number] == nums[left_number + 1]:
                    	 left_number += 1
                    # 同理判断right_number
                    while left_number < right_number and nums[right_number] == nums[right_number - 1]:
                    	 right_number -= 1
                    # 如果这三个数没有相等,则左边往右移一格left_number + 1,右边往左移一格right_number - 1
                    left_number += 1
                    right_number -= 1
                # 三数之和如果小于0
                elif nums[i]+nums[left_number] + nums[right_number] < 0:
                	#那左边的数可以往右移一格变大试一下
                    left_number += 1
                else:
                	#如果三数之和大于0
                	#那就右边的数往左移一格变小试一下
                    right_number -= 1
        return statisfied_list

猜你喜欢

转载自blog.csdn.net/qq_35547281/article/details/86744732