zoukankan      html  css  js  c++  java
  • LeetCode No.1 TwoSum 20170228

    1. Two Sum

    Given an array of integers, return indices of the two numbers such that they add up to a specific target.

    You may assume that each input would have exactly one solution, and you may not use the same element twice.

    Example:

    Given nums = [2, 7, 11, 15], target = 9,

    Because nums[0] + nums[1] = 2 + 7 = 9,

    return [0, 1].

    难度:easy

    解题思路:

    用的是python语言。没有仔细想复杂度更低的算法,一下子想到的就是一个蠢办法。既然数组中两个数之和要等于target,那么target-nums[i]也在这个数组中。只需要把target-nums[i]的下标也找出来就行了,那就再次遍历nums,找到target-nums[i]并返回其下标。但是结果一直出错。调试了一会儿才发现,测试例子给的是[3,2,4]和target=6,如果按照我的方法,6-3=3,结果会返回[0,0]。因为target减去nums[i]等于它自己,按照原本的算法是会返回两个下表的。可是数组中实际上只有一个3。后来又想了个办法,如果相减的结果等于nums[i]自己则不返回。但又遇到数组为[3,3],target=6这种情况。最后想的办法是新建一个nums1数组,将nums数组中的数一个个不断的丢到nums1中,如果target-nums[i]不在nums1中,则把nums[i]丢到nums1中的同样下标的位置上去。这样的话就可以避免第一种错误,也就是重复使用同样下标的数字,也可以避免为了解决第一种错误而忽略掉的相同数字的出现。

    代码如下

    class Solution(object):
    def twoSum(self, nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: List[int]
    """
    nums1=[]
    j=len(nums)
    for i in range(0,j):
    if (target-nums[i]) in nums1:
    for k in range(len(nums1)):
    if (target-nums[i])==nums1[k]:
    return[k,i]
    nums1.insert(i,nums[i])

    好不容易才成功了哈哈。其实自己的算法真的很糟糕,没怎么学过。后来问了问同学,也上网看了看其他算法,才发现有更加简单的算法,只要O(n)的 时间复杂度就行了。在了解了其算法原理之后自己把该算法实现了。

    先贴代码

    核心思想是把nums数组的数复制到另外一个数组numssort并将该数组从小到大排序,再取该数组头尾两个数numssort[i],numssort[j]相加,如果等于target,就去nums数组中找出他们的下标,不相等的情况里,如果他们的和大于target,说明要将他们的和变小,于是改为numssort[i],numssort[j-1]相加,如果和小于target,说明和要增大,于是改为numssort[i+1],numssort[j]相加。

  • 相关阅读:
    MOOC 浙江大学 面向对象程序设计-Java笔记(5)
    MOOC 浙江大学 面向对象程序设计-Java笔记(4)
    MOOC 浙江大学 面向对象程序设计-Java笔记(3)
    String类的学习
    MOOC 浙江大学 面向对象程序设计-Java笔记(2)
    MOOC 浙江大学 面向对象程序设计-Java 笔记(1)
    案例6-1.3 哥尼斯堡的“七桥问题” (25分)---C语言
    postfix&dovecot搭建邮件服务器
    Quaoar
    zico2靶机练习
  • 原文地址:https://www.cnblogs.com/fangdai/p/6477168.html
Copyright © 2011-2022 走看看