原题地址:https://leetcode-cn.com/articles/two-sum/

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

以上是原题


本题得出正确答案非常简单,但显然题目的意图不仅仅是得到答案,而是以更好的方式得出答案。

先来看常规思路:

  无脑循环法:

  两层循环嵌套,依次相加数组元素,和等于目标值,则返回两个循环的下标,代码如下:

     public int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length - 1; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (target == nums[i] + nums[j]) {
return new int[]{i, j};
}
}
}
return null;
}

  时间复杂度:O(n2)  

  哈希法:

  利用哈希表存储数组元素与下标的对应关系,通过一定的空间代价来换取更少的时间消耗,给出代码:

     public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], i);
}
for (int i = 0; i < nums.length; i++) {
int c = target - nums[i];
Integer t = map.get(c);
if (t != null && t != i) { // t != i 排除同一个元素被利用两次的情况
return new int[]{map.get(target - nums[i]), i};
}
}
return null;
}

  先将数组元素与其下标的对应关系存入hashmap中,在遍历数组元素,用目标值减去数组元素,如果在hashmap中能通过差值取到对应的元素,则说明该元素与差值为题目中要求得的结果。为什么要判断 (t != i)呢?这里有一种特殊情况,例如 [2, 3, 1]的数组,target=4,那么map中的值为{2 : 0, 3 :1, 1 : 2}, 在第一次循环中 nums[0] = 2, target - nums[0] = 2, map.get(nums[0]) 能取到对应的值2,返回结果[ map.get(nums[0]), nums[0] ] 也就是[0, 0],正确的结果应为[1, 2].

  采用hash法,时间复杂度为O(n).

  改解法可进一步优化为一次循环:

     public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int c = target - nums[i];
Integer t = map.get(c);
if(t != null) {
return new int[]{map.get(target - nums[i]), i};
}
map.put(nums[i], i);
}
return null;
}

  这里重点要注意第9行的map.put(nums[i], i) 要写在map.get(c)语句之后,原因与上段代码判断(t != i)相同。

最新文章

  1. python 数据处理学习pandas之DataFrame
  2. 建立mvc过程
  3. mysqldump备份过程中都干了些什么
  4. jquery使用总结
  5. android笔试题集2
  6. 图的存储结构:邻接矩阵(邻接表)&amp;链式前向星
  7. 【LightOJ1282】Leading and Trailing(数论)
  8. 阿里注册中心nacos使用整合Dubbo-原创
  9. drf框架之 路飞学城(第二天)
  10. CSS选择器之基本选择器总结
  11. linux c 获取console 结果
  12. 7.与python交互
  13. Java如何处理已检查异常?
  14. Android之封装好的异步网络请求框架
  15. applicatonContext.xml
  16. DPM恢复点和保持期、常见问题排除指南
  17. HYSBZ 1036 树的统计Count(树链剖分)题解
  18. RequestMappingHandlerMapping 详解
  19. angular4 form 表单中 input输入框的disabled属性
  20. ACE_Reactor类

热门文章

  1. IO复用——poll系统调用
  2. mysql 5.8 查询最新一条数据
  3. LeetCode:3.Longest Substring Without Repeating Characters
  4. Phoenix映射HBase数据表
  5. 【问题记录】Linux Python等交互式输入回退键出现 ^H^H
  6. Spring MVC - URL路径映射
  7. C# 删除文件错误 access denied
  8. NO12——快速幂取模
  9. 判断python字典中key是否存在的两种方法
  10. 【iOS开发】多线程下NSOperation、NSBlockOperation、NSInvocationOperation、NSOperationQueue的使用