LeetCode 刷题系列之 Two Sum_main 方法必须返回类 twosum.solution 中的空类型值,-程序员宅基地

技术标签: 算法  hash table  LeetCode  

从今天开始,争取每天带大家刷一道 LeetCode 上面的题。如果哪天我忘了,记得在后台留言提醒我哦!

题号: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].

解题思路

最简单暴力的方式是,从左向右遍历数组中的元素,每遍历到一个元素 x x x,就在整个数组中查找是否存在 t a r g e t − x target - x targetx。但是这种方式显然不是我们想要的。我们需要一种更高效的方式去检查数组中是否存在 t a r g e t − x target - x targetx,也就是 x x x 的补数,如果补数存在,我们应该立即查找到它的索引。那么,需要维护数组中的每一个元素与它的索引的映射关系,最好的方式就是使用 hash table。因为 hash table 是几乎可以做到在常数时间内查找,所以 hash table 能够将查找时间从 O ( n ) O(n) O(n) 降到 O ( 1 ) O(1) O(1),之所以说是「几乎」,因为可能会出现冲突,这时查找时间可能会退化到 O ( n ) O(n) O(n),但是,只要哈希函数选用的合理,hsah table 的平均查找时间是可以达到 O ( 1 ) O(1) O(1) 的。

利用 hash table,我们可以很容易地想到,通过两个迭代,第个一个迭代,把每一个元素的值以及它的索引组成一个键值对,放到 hash table 里面,然后,第二个迭代,检查每一个元素的补数(即 t a r g e t − n u m s [ i ] target-nums[i] targetnums[i])是否存在于 hash table 之中。下面是这种思路的实现代码:

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 complement = target - nums[i];
        if (map.containsKey(complement) && map.get(complement) != i) {
    
            return new int[] {
     i, map.get(complement) };
        }
    }
    throw new IllegalArgumentException("No two sum solution");
}

但是其实还能继续优化,当我们向 hash table 中插入键值对的时候,可以检查当前元素的补数是否已经存在于 hash table 中,如果存在,就说明我们已经找到了解,并且可以立即返回这个解。光说可能有点抽象,看代码就明白了:

public int[] twoSum(int[] nums, int target) {
    
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
    
        int complement = target - nums[i];
        if (map.containsKey(complement)) {
    
            return new int[] {
     map.get(complement), i };
        }
        map.put(nums[i], i);
    }
    throw new IllegalArgumentException("No two sum solution");
}

这里附上完整 Java 代码:

import java.util.HashMap;
import java.util.Map;

public class TwoSum {
    
	public static int[] twoSum(int[] nums, int target) {
    
		Map<Integer, Integer> map = new HashMap<>();
		for(int i = 0; i < nums.length; i++) {
    
			int complement = target - nums[i];
			if(map.containsKey(complement)) {
    
				return new int[] {
    map.get(complement), i};
			}
			map.put(nums[i], i);
		}
		throw new IllegalArgumentException("No Two Sum Solution");
	}
	
	public static void main(String[] args) {
    
		int[] nums = {
    2, 7, 11, 15};
		int target = 17;
		int[] solu = twoSum(nums, target);
		System.out.println(solu[0]);
		System.out.println(solu[1]);
	}
	
}

刷题感受

  1. 尽管之前已经学过 hash table,但是在做这个题的时候并没有想起来用它,说明自己的编程知识还没有形成一定的体系。
  2. 在这个题中,hash table 的高效可见一斑,通过哈希函数,实现从 key 到 value 的映射,查找时间可低至 O ( 1 ) O(1) O(1),是一种以空间换时间的策略。
  3. 遇到问题先不要上来就用暴力求解,多思考,有没有进一步优化的可能。这种优化的思维需要长久的练习来提高。

欢迎关注我的微信公众号,扫描下方二维码或微信搜索:AProgrammer,就可以找到我,我会持续为你分享 IT 技术。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/young2415/article/details/85948033

智能推荐

Could not find resource mybatis-config.xml :找不到mybatis的配置文件_exception in thread "main" java.io.ioexception: co-程序员宅基地

文章浏览阅读1.4w次,点赞47次,收藏51次。项目场景:之前运行出来过,后面重新导入了一下 结果报错了 (代码是没有问题的)问题描述:Exception in thread “main” java.io.IOException: Could not find resource mybatis-config.xml :找不到mybatis的配置文件原因分析:找不到mybatis配置文件原来mybatis.xml文件没有放在 target 下的 classes 中,导致报错。解决方案:将 mybatis.xml拷贝到 target 下的_exception in thread "main" java.io.ioexception: could not find resource myba

R语言ggplot2可视化使用ggsave将可视化图像结果保存为SVG文件实战-程序员宅基地

文章浏览阅读1.1w次,点赞5次,收藏14次。R语言ggplot2可视化使用ggsave将可视化图像结果保存为SVG文件实战#使用ggsave将可视化图像结果保存为SVG文件 require("ggplot2")#some sample data head(diamonds) #to see actually what will be plotted and compare qplot(clarity, data=diamonds, fill=cut, geom="bar")#save the plot in_ggsave

HTML - 元素/标签详解_元素中的头部-程序员宅基地

文章浏览阅读4.9k次,点赞17次,收藏82次。HTML头部元素 元素包含了所有的头部标签元素。在 元素中你可以插入脚本(scripts), 样式文件(CSS),及各种meta信息。可以添加在头部区域的元素标签为: , , , , , , . 标签定义了不同文档的标题。 在 HTML/XHTML 文档中是必须的。定义了浏览器工具栏的标题当网页添加到收藏夹时,显示在收藏夹中的标题显示在搜索引擎结果页面的标题 标签描述了基本的链接地址/链接目标,_元素中的头部

Spring Boot + MinIO 实现文件切片极速上传技术_spring boot minio实现文件切片极速上-程序员宅基地

文章浏览阅读7.5k次,点赞35次,收藏58次。文件切片上传是指将大文件分割成小的片段,然后通过多个请求并行上传这些片段,最终在服务器端将这些片段合并还原为完整的文件。这种方式有助于规避一些上传过程中的问题,如网络不稳定、上传中断等,并能提高上传速度。通过本文,我们深入了解了如何使用Spring Boot和MinIO实现文件切片上传技术。通过文件切片上传,我们能够提高文件上传的速度,优化用户体验。在实际应用中,我们可以根据需求进行性能优化和功能拓展,使得文件上传系统更加强大和可靠。_spring boot minio实现文件切片极速上

android 陀螺仪滤波_android – 卡尔曼滤波器 – 指南针和陀螺仪-程序员宅基地

文章浏览阅读617次。我正在尝试用陀螺仪,加速度计和万用表构建罗盘.我正在将acc值与测量值融合以获得方向(使用旋转矩阵)并且它工作得非常好.但现在我想添加陀螺仪,以便在磁传感器不准确时进行补偿.因此,我想使用卡尔曼滤波器来融合两个结果并获得一个很好的过滤结果(acc和mag已经使用lpf进行过滤).我的矩阵是:state(Xk) => {Compass Heading, Rate from the gyro i..._android陀螺仪 定位

深入理解Instant Run——原理篇-程序员宅基地

文章浏览阅读1.3k次。前言Instant-run是Android Studio 2.0开始引入的新特性,它的作用是使开发者在开发时的改动可以很快地被应用,节省开发者的时间。当改动了代码之后,不需要进行完整的构建过程生成新的apk并且重新安装,只是把涉及到改动的部分push到设备上,某些情况下甚至都不需要重启当前Activity,马上就可以看到改动。牛逼啊,简直黑科技。hotfix(热更新)的使用场景类似instan..._instant run

随便推点

前端对接微信公众号网页开发流程,JSSDK使用_开发微信网页流程-程序员宅基地

文章浏览阅读1.6k次。前面两篇文章讲解了和,本篇文章讲解关于微信JSSDK的使用,_开发微信网页流程

c语言万年历方案论证,C语言编写方案-万年历分析.doc-程序员宅基地

文章浏览阅读304次。C语言编写方案-万年历分析难易程度中等开发语言C《课程案例——案例6.1.1 功能概述如图6-1所示,系统主要功能有:显示当前日期和时间,以及星期信息。显示要查询的某年某月的月历,包括公历数据以及其相应的农历数据,如:天干地支、生肖、节气等。要查询的年份和月份可以从键盘直接输入,也可以通过输入“1-4”四个数字键来增加减少年份和月份的方法查询。6.1.2 系统硬件环境处理器:Intel Penti..._c语言方案论证怎么写

【ggplot2】RGB配色表_ggplot2set1自定义的颜色的rgb值依次为:-程序员宅基地

文章浏览阅读2.1k次。https://www.917118.com/tool/color_3.html_ggplot2set1自定义的颜色的rgb值依次为:

使用箱线图比较模型的均方误差(MSE)指标(R语言实现)_r语言绘制箱线图来比较不同模型的mse指-程序员宅基地

文章浏览阅读349次。它用于衡量模型预测结果与真实观测值之间的差异程度,是一个重要的性能度量指标。本文将介绍如何使用R语言绘制箱线图来比较不同模型的MSE指标,并提供相应的源代码。如果一个模型的箱子较小且位于较低的数值范围内,说明该模型具有较低的MSE值,即预测结果与真实观测值更接近。相反,如果一个模型的箱子较大且位于较高的数值范围内,说明该模型的预测效果较差。箱线图是一种简单而强大的可视化工具,可以用于比较不同模型的MSE指标。在本文中,我们使用R语言绘制了一个模型MSE指标对比图的箱线图,并提供了相应的源代码。_r语言绘制箱线图来比较不同模型的mse指

金融专业将来要被计算机代替,计算机取代金融成为热门专业,金融不香了吗?网友:家境不好别学...-程序员宅基地

文章浏览阅读695次。在多数家长和考生看来,报考大学时,专业一定要选择最热门的,越是高大上就越好就业。但其实,热门专业也在不断变化。比如过去提起金融专业,大家想到的就是这个专业非常高大上,毕业后工作环境好。但短短数年过去,金融已经不是人人青睐的热门专业了,计算机相关专业迅速取代金融专业,成为了广受欢迎的专业。随着这两个专业报考人数的变化,有网友在某问答平台上提问:是金融不香了吗?针对这个问题,网友们讨论得非常积极。而在..._计算机就是下一个金融是什么意思

Android自定义Dialog多选对话框(Dialog+Listview+CheckBox)_android 自定义多选对话框-程序员宅基地

文章浏览阅读9.9k次,点赞2次,收藏12次。先放效果截图 项目中需要有个Dialog全选对话框,点击全选全部选中,取消全选全部取消。下午查了些资料,重写了一下Dialog对话框。把代码放出来。public class MainActivity extends Activity { View getlistview; String[] mlistText = { "全选", "选择1", "选择2", "选择3", "选择4"_android 自定义多选对话框