zoukankan      html  css  js  c++  java
  • [LeetCode]题解(python):001-Two-Sum

    题目来源:

    https://leetcode.com/problems/two-sum/


    题意分析:

          这道题目是输入一个数组和target,要在一个数组中找到两个数字,其和为target,从小到大输出数组中两个数字的位置。题目中假设有且仅有一个答案。


    题目思路:

         如果直接暴力解决,时间复杂度为(O(n^2)),很明显这种方法会TLE。

         那么如果给定的数组是有序的会不会降低难度呢?如果是有序的数组,那么我们可以用“夹逼定理”来处理。简单来说就是首尾相加,如果比target大,则将尾数左移,如果小了首尾右移,直到两个数相加刚好等于target,那么我们可以先将数组排序,然后用“夹逼定理”,这种方法的时间复杂度为(O(nlogn)。这种方法要注意的是排序的时候要记录数组原来的位置,然后再排序。

        接下来我来介绍最后一种方法。在python里面有一个dictionary的和C++ 的map功能一样。首先,我们建立一个字典,d = {},字典的key是数组的值num,value是相应的位置, 然后只要满足 num 和 target - num都在字典里面则找到答案。这种方法的时间复杂度是(O(n))。


    代码(python):

    class Solution(object):
        def twoSum(self, nums, target):
            """
            :type nums: List[int]
            :type target: int
            :rtype: List[int]
            """
            d = {}# d is a dictionary to map the value of nums and the index in nums
            size = 0
            while size < len(nums):
                if not nums[size] in d:
                    d[nums[size]] = size + 1 #if nums[size] doesn't exist in d ,create it
                if target - nums[size] in d: #if nums[size] and target - nums[size] are both in d
                    if d[target-nums[size]] < size + 1: # one situation should be minded nums[size] == target - nums[size]
                        ans = [d[target - nums[size]] , size + 1]# for example [0,1,2] 0 and [0,1,2,0],0
                        return ans
                size = size + 1
    View Code

    PS:注意情况,注意特殊情况。比如target刚好是数组中某个数的2倍,且这个数只有一个或者二个的时候,如[3],6和[3,2,3],6。


    转载请说明出处:http://www.cnblogs.com/chruny/

  • 相关阅读:
    【转】win8.1下安装ubuntu
    Codeforces 1025G Company Acquisitions (概率期望)
    Codeforces 997D Cycles in Product (点分治、DP计数)
    Codeforces 997E Good Subsegments (线段树)
    Codeforces 1188E Problem from Red Panda (计数)
    Codeforces 1284E New Year and Castle Building (计算几何)
    Codeforces 1322D Reality Show (DP)
    AtCoder AGC043C Giant Graph (图论、SG函数、FWT)
    Codeforces 1305F Kuroni and the Punishment (随机化)
    AtCoder AGC022E Median Replace (字符串、自动机、贪心、计数)
  • 原文地址:https://www.cnblogs.com/chruny/p/4788804.html
Copyright © 2011-2022 走看看