程序 = 数据结构 + 算法。

算法是每一位程序员学习成长之路上无法避开的重要一环,并且越早接触越好。今后会每天做些算法题,至少每天做一道题目,同时会记录自己的解题思路和代码,通过【算法】专题来分享。针对数据结构这一块的知识,我也会抽时间补习,毕竟不是科班出生,从长远看,数据结构与算法学的越早越扎实越好,不管你使用的是哪一种开发语言。

01 看题和准备

给定一个整数数组和一个目标整数,该目标整数满足数组中两元素之和,返回数组中两个数字的下标索引,以数组形式表示结果。例如给定数组int[] nums = [2, 7, 11, 15],目标整数int target = 9,因为 nums[0] + nums[1] = 2 + 7 = 9,返回包含两数索引的数组[0, 1]。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 分析题目

这道题目求的是数组内任意两元素之和等于给定的目标整数,于是很容易想到数组for循环遍历,并且是两层for循环,于是第一版的代码思路已经有了。

public int[] twoSum(int[] nums, int target) {
int[] result = new int[2];
if (nums.length < 2) {
return null;
}
try {
for (int i=0; i<nums.length; i++) {
for (int j=i+1; j<nums.length; j++) {
if (nums[i] + nums[j] == target) {
result[0] = i;
result[1] = j;
}
}
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return result;
}

03 是否还可以优化?

上面的解法是两层循环,循环次数是n*(n-1)次,n为数组元素个数,n越大,程序执行的时间越长,那能不能只循环一次?既然可以做加法匹配,那做减法呢?先拿到目标整数与数组中每位元素的差值,再去判断此差值是否存在于此数组中。这时,我们需要一个存新数据的集合,既包含每位元素,也包含每位元素的索引,对此选取Map作为存放新数据的对象。

public int[] twoSum2(int[] nums, int target) {
int[] result = new int[2];
if (nums.length < 2) {
return null;
}
try {
Map<Integer, Integer> map = new HashMap<>();
for (int k=0; k<nums.length; k++) {
int num = target - nums[k];
if (map.containsKey(num)) {
result[0] = map.get(num);
result[1] = k;
}
map.put(nums[k], k);
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return result;
}

第二版的解法只用了一层循环,对比第一版解法,从时间花费上看,第二版的解法是优于第一版的。

04 小结

本篇只是作为一个开题,后续会将其他算法题按照上面的格式分享给大家,如果有什么好的解法、建议或者其他问题,可以下方留言交流!

本文首发于我的个人公众号:悦乐书,转载请注明出处!

【算法】LeetCode算法题-Two Sum的更多相关文章

  1. 乘风破浪:LeetCode真题_040_Combination Sum II

    乘风破浪:LeetCode真题_040_Combination Sum II 一.前言 这次和上次的区别是元素不能重复使用了,这也简单,每一次去掉使用过的元素即可. 二.Combination Sum ...

  2. 乘风破浪:LeetCode真题_039_Combination Sum

    乘风破浪:LeetCode真题_039_Combination Sum 一.前言     这一道题又是集合上面的问题,可以重复使用数字,来求得几个数之和等于目标. 二.Combination Sum ...

  3. (算法)LeetCode刷题

    LeetCode 56 合并区别 Given [1,3],[2,6],[8,10],[15,18], return [1,6],[8,10],[15,18]. 关键就是a[1]>=b[0] 也就 ...

  4. leetcode第一题--two sum

    Problem:Given an array of integers, find two numbers such that they add up to a specific target numb ...

  5. LeetCode第一题—— Two Sum(寻找两数,要求和为target)

    题目描述: Given an array of integers, return indices of the two numbers such that they add up to a speci ...

  6. LeetCode算法题-Two Sum IV - Input is a BST(Java实现)

    这是悦乐书的第280次更新,第296篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第148题(顺位题号是653).给定二进制搜索树和目标数,如果BST中存在两个元素,使得 ...

  7. LeetCode算法题-Path Sum III(Java实现)

    这是悦乐书的第227次更新 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第94题(顺位题号是437).您将获得一个二叉树,其中每个节点都包含一个整数值.找到与给定值相加的路径数 ...

  8. LeetCode算法题-Sum of Left Leaves(Java实现)

    这是悦乐书的第217次更新,第230篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第85题(顺位题号是404).找到给定二叉树中所有左叶的总和.例如: 二叉树中有两个左叶 ...

  9. LeetCode算法题-Sum of Two Integers(Java实现)

    这是悦乐书的第210次更新,第222篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第78题(顺位题号是371).计算两个整数a和b的总和,但不允许使用运算符+和 - .例 ...

  10. LeetCode算法题-Range Sum Query Immutable(Java实现)

    这是悦乐书的第204次更新,第214篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第70题(顺位题号是303).给定整数数组nums,找到索引i和j(i≤j)之间的元素之 ...

随机推荐

  1. NLP入门(二)探究TF-IDF的原理

    TF-IDF介绍   TF-IDF是NLP中一种常用的统计方法,用以评估一个字词对于一个文件集或一个语料库中的其中一份文件的重要程度,通常用于提取文本的特征,即关键词.字词的重要性随着它在文件中出现的 ...

  2. 一个简单的Code First建立

    1]从VS中建立一个mvc程序 记得添加NuGet包 然后在web.config中添加链接数据库的语句 <connectionStrings> <add name="Ent ...

  3. [转]usdt omnicore testnet 测试网络

    本文转自:https://www.jianshu.com/p/417c280b8f9f Testnet 模式允许 omni core 运行在比特币测试链上,用于安全测试. 为了在 testnet 上收 ...

  4. 12个非常有用的JavaScript技巧

    在这篇文章中,我将分享12个非常有用的JavaScript技巧.这些技巧可以帮助你减少并优化代码. 1) 使用!!将变量转换成布尔类型 有时,我们需要检查一些变量是否存在,或者它是否具有有效值,从而将 ...

  5. CSS的简单复习总结

    如果说网页是人的话那么CSS就是化妆品了哈哈哈,所以网页离不开CSS的装饰.id选择器和Class选择器    二者都是用来选择元素进行装饰的,我个人理解是类选择器包含了id选择器,class选择器不 ...

  6. asp.net-基础-20180321

    C#与.NET的关系 C#不是语言,.net是平台.

  7. WPF BitmapImage 占用资源无法释放、无法删除问题

    使用Image控件显示图片后,虽然自己释放了图片资源,Image.Source =null 了一下,但是图片实际没有释放.解决方案:修改加载方式~        public static Bitma ...

  8. html5基础!!

    A:HTML5 不基于 SGML,所以不需要引用 DTD: B: HTML 4.01 基于 SGML,而HTML5不基于SGML: DTD可定义合法的XML文档构建模块,它使用一系列合法的元素来定义文 ...

  9. WORLD 快速线

    1,3个“-”     一条直线 2,3个“=”    一条双直线 3,3个“*”     一条虚线 4,3个“~”     一条波浪线 5, 3个“#”    一条隔行线

  10. jQuery中页面返回顶部的方法总结

    当页面过长时,通常会在页面下方有一个返回顶部的button,总结一下,大概三种实现方法,下面说下各方法及优缺点. 方法一 锚点定位 ? 1 <a href="#" class ...