zoukankan      html  css  js  c++  java
  • two sum(LeetCode)

    该题目是leetcode上一道非常简单但是经典的题,现把该题的较为经典的解题思路进行总结

    1 题目描述

    该题的输入是给定一个数组,以及一个目标值,通过计算找出数组中两个元素和等于目标值的各自的索引。

    如下例子所示:

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

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

    return [0, 1].

    2 python解题思路

     1 class Solution(object):
     2     def twoSum(self, nums, target):
     3         if len(nums) <= 1:
     4             return False
     5         buff_dict = {}   #创建一个空字典
     6         for i in range(len(nums)):  #循环查找nums数组中的每一个元素
     7             if nums[i] in buff_dict:  #判断该元素是否在字典中,如果在字典中,进入该分支
     8                 return [buff_dict[nums[i]], i]   #将该键(nums[i])在字典中的值以及该值在nums数组中的索引返回作为最终结果
     9             else:
    10                 buff_dict[target - nums[i]] = i   #如果数组中该索引的值不在字典中,那么将该目标值(也就是输入的和targrt)减去该值作为字典中的一个键,把该值的索引作为键对应的值存储

    这种解题思路的巧妙之处就在于一次循环就可以完成搜索,时间复杂度是O(n)

    原因是首先通过索引循环数组中的每个值,假如该值不在字典中,那么存储的是目标值与该值的差,以及该值在数组中索引,在之后的搜索中是判断数组中每个值是否在字典中,额就是是否正好等于这个差,如果等于,那么说明这两个数的和正好就是目标值,如果字典中不存在该值,那么同样将该值和目标值的插值存于数组中,就是是更新了字典。

    每次的循环判断都是去查找数组中之前的所有元素与目标值的差,这是该解题方式的巧妙之处。

    该题用到了python中的字典,也就是Java或者C++中的hash表,在python中的基本使用如下所示:

    字典是另一种可变容器模型,且可存储任意类型对象。

    字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 ,格式如下所示:

    1 d = {key1 : value1, key2 : value2 }

    3 java解题思路

    将python的解题思路用Java实现如下所示:

     1 class Solution {
     2     public int[] twoSum(int[] nums, int target) {
     3         Map<Integer, Integer> map = new HashMap<>();
     4     for (int i = 0; i < nums.length; i++) {
     5         int complement = target - nums[i];
     6         //map.put(complement, i);      
     7         if (map.containsKey(nums[i])) {
     8             return new int[] { map.get(nums[i]), i};
     9         }
    10         else {
    11             map.put(complement, i); 
    12         }
    13     }
    14     throw new IllegalArgumentException("No two sum solution");
    15     }
    16 }
    
    
  • 相关阅读:
    对于Netty的十一个疑问
    IDEA中:求类似于eclipse中的ctrl+shift+o,我之前配置过后来重装找不到了,不是alt+enter也不是勾选自动导包
    Android之assets资源目录的各种操作
    五种方式让你在java中读取properties文件内容不再是难题
    Delphi 接口使用中,对象生命周期管理,如何释放需要注意的问题
    利用FR导出PDF汉字乱码的处理
    赵伟国辞去TCL集团董事等职位,紫光参与TCL定增浮盈已超7亿
    中山的房价
    webpack
    为什么需要索引
  • 原文地址:https://www.cnblogs.com/guo-zhi-wei/p/10015182.html
Copyright © 2011-2022 走看看