我的方法:复杂度sqrt(n).

思路:现将nums备份,将nums排序,再从两端逐步向中间靠拢,寻找nums[i]+nums[j]=target。输出nums[i],nums[j]再备份中的index。函数list.index(value)

list.index(val,start,end)----在这个范围内寻找val第一次出现的index。

如果val出现多次,可以将前一次出现的index的位置另赋值。(但这个方法,不好)应该设定start,end的值。详见方法二。

def twoSum(self, nums, target):
        l=len(nums)
        s=[]
        s=nums
        nums=sorted(nums)
        i=0
        j=l-1
        while (i<l) & (j>i):            
            if nums[i]+nums[j]==target:
                temp_1=s.index(nums[i])
                s[temp_1]=3.5
                return [temp_1,s.index(nums[j])]
            elif nums[i]+nums[j]>target:
                j-=1
            else:
                i+=1

方法二:大神的,复杂度为n。遍历nums,得到target-i的值,如果这个值在nums中(if a in nums),直接输出list

.index(a,m+1,len(nums))。否则继续遍历



    def twoSum(self, nums, target):
      for i in nums:
          a=target-i
          m=nums.index(i)
          if a in nums:
              try:
                  n=nums.index(a,m+1,len(nums))
                  return (m,n)
              except:
                  continue

方法三:复杂度为n

        if len(nums) <= 1:
            return False
        buff_dict = {}
        for i in range(len(nums)):
            if nums[i] in buff_dict:
                return [buff_dict[nums[i]], i]
            else:
                buff_dict[target - nums[i]] = i

和法二方法相似,创建dict,target-nums[i]为key,索引i为values。向后遍历,如果新的数在dict的key中,则输出dict[nums[ii]]的values和ii。

注:for key in dict:返回的是键。等于   for key in dict.keys()

 

方法四:java

import java.util.*;
class Solution{
	public int[] twoSum(int[] nums, int target) {
		int[] b=new int[2];  
		List<Integer> list = new ArrayList<>(); 
		for(int i=0;i<nums.length;i++) {
			list.add(target-nums[i]);
		}		
		for(int i=0;i<nums.length;i++) {
			int index = list.lastIndexOf(nums[i]);
			if(index>-1&&index!=i) {
				b[0]=i;
				b[1]=index;
			}
		}
		 return b;
	}