• [Leetcode] Two Sum @Python


    首先作这个题,最直接的思路是两个for循环,然而所带来的缺陷是时间复杂度太高O(n2)。所以要转变思路:如何能一次遍历就解决问题?

    因为是两个数相加来得到一个既定的数(target),那就有一个思路是:能不能两头相加,然后通过头指针和尾指针来回向中间靠拢来实现?

    答案是可以的。分两步走:

    1. 排序
    2. 设置头、尾两指针,实现一次遍历。

    注意事项:

    1. 找到两个数后需要返回两个数的位置,所以需要先备份原序列,使用备份序列进行排序和查找操作,然后查看备份序列找到的数在原序列的位置。
    2. 在查看备份序列找到的数在原序列位置时,因为要找两个数,所以第一个数要从前遍历,第二个数要从后遍历。否则会出现如下错误:num = {0,2,4,0} target = 0

    语法细节:

    1. 对于序列的复制,可以采用num[:]实现,效果是生成了一个与num相同的新的序列
    2. 对于Python一个类中方法的定义,第一个参数为self,
    3. 一个Python模块自己测试,使用 if __name__ == '__main__':
    4. 对于一个类Solution,创建实例方式:solution = Solution()

    代码实现:

    class Solution:
        # @return a tuple, (index1, index2)
        def twoSum(self, num, target):
            numtosort = num[:]
            numtosort.sort()
            i = 0 
            j = self.search(numtosort,target)
            while(i < j):
                if(numtosort[i] + numtosort[j] == target):
                    be = self.before_search(num,numtosort,i)
                    af = self.after_search(num,numtosort,j)
                    if be < af:
                        return (be,af)
                    else:
                        return (af,be)
                elif(numtosort[i] + numtosort[j] < target):
                    i = i + 1
                else:
                    j = j - 1
        def search(self,numtosort,target):
            for i in range(0,len(numtosort)):
                if numtosort[len(numtosort)-i-1] <= target:
                    if i == 0:
                        return len(numtosort)-1
                    else:
                        return len(numtosort)-i                            
        def before_search(self,num,numtosort,number):
            for i in range(0,len(num)):
                if(num[i] == numtosort[number]):
                    return i+1
        def after_search(self,num,numtosort,number):
            for i in range(0,len(num)):
                if(num[len(num)-i-1] == numtosort[number]):
                    return len(num)-i
    if __name__ == '__main__':
        num = [-3,4,3,90]
        target = 0
        solution = Solution()
        print solution.twoSum(num,target)              
  • 相关阅读:
    eclipse配置
    TableViewComponent v2
    4500装机指南
    【翻译】Ext JS 4——Ajax和Rest代理处理服务器端一场和消息的方法
    【翻译】Ext JS——高效的编码风格指南
    JDK8帮助文档生成-笔记
    【翻译】在Ext JS 5种使用ViewControllers
    【翻译】Ext JS最新技巧——2014-5-12
    PS图像特效算法——百叶窗
    人脸表情识别常用的几个数据库
  • 原文地址:https://www.cnblogs.com/tosouth/p/4268245.html
Copyright © 2020-2023  润新知