Java实现LeetCode(1.两数之和)

 更新时间:2021年07月09日 09:50:30   作者:NullPointerExcept  
这篇文章主要介绍了Java实现LeetCode(两数之和),本文使用java采用多种发放实现了LeetCode的两数之和题目,需要的朋友可以参考下

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

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

示例:

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

因为 nums[0] + nums[1] = 2 + 7 = 9

所以返回[0, 1]

思路一:最直接的思维,两次遍历查询,时间复杂度O(N*N)。

代码:

public static int[] twoSum1(int[] nums, int target) {
		int[] label = new int[2];
		for(int i=0;i<nums.length-1;i++) {
			int tmp = target - nums[i];
			for(int j=i+1;j<nums.length;j++) {
				if(tmp == nums[j]) {
					label[0] = i;
					label[1] = j;
				}
			}
		}
		return label;
	}

思路二:先排序,然后两个指针i,j,i从前开始,j从后开始查找,当nums[i]+nums[j]>target时,j--;当nums[i]+nums[j]<target时,i++;注意排序后,之前的下标数字已经变化了。时间复杂度O(N*Log2N)

代码:

public static int[] twoSum2(int[] nums, int target) {
		int[] label = new int[2];
		int[] tmpArr = new int[nums.length];
		for(int i=0;i<nums.length;i++) {
			tmpArr[i]=nums[i];
		}
		Arrays.sort(nums);
		int i=0;
		int j=nums.length-1;
		while (i<j) {
			if(nums[i]+nums[j]==target) {
				label[0] = nums[i];
				label[1] = nums[j];
				break;
			}else if(nums[i]+nums[j]>target){
				j--;
			}else {
				i++;
			}
		}
		for(int k=0;k<tmpArr.length;k++) {
			if(tmpArr[k]==label[0]) {
				label[0]=k;
			}
			if(tmpArr[k]==label[1]) {
				label[1]=k;
			}
		}
		return label;
	}

思路三:利用空间换时间方式,用hashmap存储数组结构,key为值,value为下标。时间复杂度O(N)。

代码:

public static int[] twoSum3(int[] nums, int target) {
		int[] label = new int[2];
		HashMap<Integer, Integer> hashMap = new HashMap<>();
		for(int i=0;i<nums.length;i++) {
			hashMap.put(nums[i], i);
		}
		for(int i=0;i<nums.length;i++) {
			if(hashMap.containsKey(target-nums[i])&&hashMap.get(target-nums[i])!=i) {
				label[0] = i;
				label[1] = hashMap.get(target-nums[i]);
				break;
			}
		}
		return label;
	}

github地址:https://github.com/xckNull/Algorithms-introduction

到此这篇关于Java实现LeetCode(两数之和)的文章就介绍到这了,更多相关Java实现两数之和内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • @PathVariable、@RequestParam和@RequestBody的区别

    @PathVariable、@RequestParam和@RequestBody的区别

    本文主要介绍了@PathVariable、@RequestParam和@RequestBody的区别和使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Java+OpenCV实现人脸检测并自动拍照

    Java+OpenCV实现人脸检测并自动拍照

    这篇文章主要为大家详细介绍了Java+OpenCV实现人脸检测,并调用笔记本摄像头实时抓拍,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • SpringBoot + Disruptor实现特快高并发处理及使用Disruptor高速实现队列的过程

    SpringBoot + Disruptor实现特快高并发处理及使用Disruptor高速实现队列的过程

    Disruptor是一个开源的Java框架,它被设计用于在生产者—消费者(producer-consumer problem,简称PCP)问题上获得尽量高的吞吐量(TPS)和尽量低的延迟,这篇文章主要介绍了SpringBoot + Disruptor 实现特快高并发处理,使用Disruptor高速实现队列,需要的朋友可以参考下
    2023-11-11
  • Java中的stream流的概念解析及实际运用总结

    Java中的stream流的概念解析及实际运用总结

    流是指传输时的数据,Java为流准备了很多内置类,尤其是IO输入输出流非常常用,这里我们来看一下Java中的stream流的概念解析及实际运用总结
    2016-06-06
  • Spring Cloud Feign 使用对象参数的操作

    Spring Cloud Feign 使用对象参数的操作

    这篇文章主要介绍了Spring Cloud Feign 如何使用对象参数的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • Java 判断数组是否相等的方法示例

    Java 判断数组是否相等的方法示例

    这篇文章主要介绍了Java 判断数组是否相等的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • 关于WeakhashMap与HashMap之间的区别和联系

    关于WeakhashMap与HashMap之间的区别和联系

    这篇文章主要介绍了关于WeakhashMap与HashMap之间的区别和联系,WeakHashMap从名字可以得知主要和Map有关,不过还有一个Weak,我们就更能自然而然的想到这里面还牵扯到一种弱引用结构,因此想要彻底搞懂,我们还需要知道四种引用,需要的朋友可以参考下
    2023-09-09
  • java实现字符串和日期类型相互转换的方法

    java实现字符串和日期类型相互转换的方法

    这篇文章主要介绍了java实现字符串和日期类型相互转换的方法,涉及java针对日期与字符串的转换与运算相关操作技巧,需要的朋友可以参考下
    2017-02-02
  • Spring maven filtering使用方法详解

    Spring maven filtering使用方法详解

    这篇文章主要介绍了Spring maven filtering使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • springboot-controller的使用详解

    springboot-controller的使用详解

    本篇文章主要介绍了springboot-controller的使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08

最新评论