zoukankan      html  css  js  c++  java
  • LeetCode第15题3Sum

    题目的意思就是说,给一个数组,在这个数组里面找出三个数的和为0的三个数。将这三个数输出。不能有重复的三个数。

    刚开始作者道题的时候,想法是找到0或者和0最近的一个数的位置。然后用两个参数往两边移动。但是这样的话总是会出现一些问题,在提交的时候总是有个别的输入跑出的结果不对。也用过三个循环暴力解决,但是时间超时了。

    最后想了想,看了网上别人的代码,将自己的刚开始的想法推翻了。重新用另一种思路解决这个问题。

    1、将数组排序,利用sort函数

    2、利用两层循环遍历,第一层循环实现i从前到倒数第三个数的遍历。第二层循环实现两个参数指针从i以后的数组的两边实现遍历。

    3、当nums[i]和nums[lift]和nums[right]的和大于零的时候,right往左移动。当他们的和小于零的时候,lift往右移动。

    4、最重要的是,当他们的和为零的时候,将这三个数放入list中。同时要注意那些nums[i]和nums[right]和nums[lift]重复的数字,利用三个while,分别跳过重复的数字。

    5、之后再第一个循环的后面不要忘了将i加一。

    下面是实现的代码:

    class Solution:
        def threeSum(self,nums):
            re = list()
            i = 0
            lift = 0
            right = 0
            nums.sort()
            while i < len(nums)-2:
                lift = i+1
                right = len(nums) - 1
                while lift  < right:
                    if nums[i] + nums[right] + nums[lift] >0:
                        right = right - 1
                    elif nums[i] + nums[right] + nums[lift] < 0:
                        lift = lift + 1
                    else:
                        re.append([nums[lift], nums[i], nums[right]])
                        right = right - 1
                        while right >lift and nums[right]==nums[right+1]:
                            right = right - 1
                        lift = lift + 1
                        while right >lift and nums[lift] == nums[lift-1]:
                            lift = lift + 1
                        while i < len(nums)-2 and nums[i]==nums[i+1]:
                            i = i +1
                i = i + 1
            return re
  • 相关阅读:
    java抽象类怎么实例化了及C++中抽象类的构造函数
    树及其遍历
    C++中类的多态与虚函数的使用
    C++中#if #ifdef 的作用
    用链表实现两大数相乘
    C++中的链表类的设计
    IPicture总结
    c++标准库中,含有链表的类list
    TCP/IP、Http的区别
    C语言单链表实现19个功能完全详解
  • 原文地址:https://www.cnblogs.com/andingding-blog/p/8661718.html
Copyright © 2011-2022 走看看