leetcode中的两数之和(第一题:简单)

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

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]

题意:给一个整形的数,这个数在会在给定数组的两个位置数相加的和!这个和是指值的相加,不是数组的索引相加;如果在数组中有这样的两个数,要求返回两个数的索引(也就是数组的下标);

解法一:暴力方法:应用遍历的方式,应用双重循环,怎么说呢,举个例子 nums = [2, 7, 11, 15], target = 9,第一重循环遍历第一个数nums[0](值为2)时,在用第二层循环从下标1~3开始遍历,如果下标1~3的值和nums[0]相加会等于target:9那么会返回相加两数的下标,如果两重循环结束还没有找到那么就返回null,在这里其实索引和下标的概念是一样的,只是每个人的叫法不一样! 

public int[] solutin(int[] nums,int target){
		for(int i=0;i<nums.length;i++){//1.对每个位置的数进行遍历
			for(int j=i+1;j<nums.length;j++){//2.对i后面的数进行遍历
			//这里解释一下,为什么从i的后面开始遍历,不仅仅是为了减少时间复杂度,更是为了一种极端的例子比如:
			//nums[3,2,6],target=6,如果第二重循环从i本身开始遍历,那么会返回下标[0,0]
				if(nums[i]+nums[j]==target){//3.i和后面的每一个数相加值与target比较
					return new int[]{i,j};//4.如果相加值会等于target,那么就返回相加值在nums数组中的下标
				}
			}
		}
		return null;//5.两重循环结束表示在数组中没有这样的两个数
		/**
		 * 来看一下时间复杂度:在最差的情况下,比如nums[1,2,3,4,5,6,7,8,9,10],target=19;
		 * 你可以把这个例子带入上面的暴力算法中,得出的肯定是循环9,8,7,6,5,4,3,2,1,
		 * 这就是一个等差数列,那么最坏情况下时间复杂度就是o(n^2)
		 * 在来看一下空间复杂度:在这个算法中,只用了有限的变量i和j,那么空间复杂度就是o(1)
		 */
	}

 时间和空间的展示:

下面介绍一种改进的方法:应用了hash这个性质,其实这查找这个问题里,hash是非常好用的,因为hash插入和删除和查找复杂度都是o(1),在这里我应用了java的hashMap

思路:先把遍历把nums数组的数加入到hashMap中,hashMap中的key存nums中的值,value存入nums中每个值对应的下标,在用一层遍历,从nums数组的开头开始遍历,用target减掉每个nums的值,在用这个减出来的值,在hashMap中查找,如果有,就得到value,最后返回这两个下标,

例子nums[1,2,3,4],target=7,先把nums加入到hashMap中,那么hashMap[{1,0},{2,1},{3,2},{4,3}],当遍历到下标为2时也就是nums[2]=3,用7-3=4,在调用map的containsKey()方法,查询map中有key的值为4吗,这时就有,那么就返回new int[]{2,3};

public int[] twoSum(int[] nums, int target) {
        if(nums==null){//1.判断给的nums数组是否为空,为null就没有必要进行下面的操作,并且会出现空指针操作
            return null;
        }
        Map<Integer,Integer> map = new HashMap<Integer,Integer>();//2.初始化HashMap集合,为什么用Hash呢就是因为查找的时间复杂度为o(1),这事最低的代价
        for(int i=0;i<nums.length;i++){//3.把nums数组的每个值和下标加入到HashMp中
            map.put(nums[i],i);
        }
        for(int j=0;j<nums.length;j++){//4.从下标0开始遍历nums数组
        	//5.判断target键下标nums[j]的值在HashMap中是否存在,
        	//并且得到的value也就是下标步等于j,这是防止一种情况,nums[3,7,8,2,4]
        	//如果target=6,当j=0时,targt-num[0]=3;在看hashMap是否包含3刚好就是下标0本身,
        	//但是题意说不可重复,一个数字只能用一次,so-----
            if(map.containsKey(target-nums[j])&&map.get(target-nums[j])!=j){
                return new int[]{j,map.get(target-nums[j])};//6.包含就返回这两个数的下标
            }
        }
        return null;//7.如果没有找到就返回null
        /***
         * 分析时间复杂度两个循环第一个循环为o(n),
         * 第二重循环在最坏的情况nums[0,1,2,3,4,5,6,7],target=13时
         * 时间复杂度为o(n),加在一起O(n),为什么不是2N呢,因为当n很大时2没有意义了,比如n为1千万亿,
         * 那你的机器估计也歇菜了,在估计时间复杂度的时候是去掉常数项的
         * 空间复杂度:因为用了hash这个结构(底层用了数组来存储),所以空间复杂度为o(n)
         */
    }

  复杂度展示

跟上面的暴力方法相比,这时间绝对优秀,本来想录一下视频讲一下这题,但是没有时间,下次有时间来哈,有错的地方望大佬纠正

原文地址:https://www.cnblogs.com/tranquilityMan/p/10954823.html

时间: 2024-10-15 00:49:02

leetcode中的两数之和(第一题:简单)的相关文章

LeetCode | No.1 两数之和

题目描述: 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. 给定一个整数数组nums和一个目标值target,请你在该数

leetcode——Two Sum 两数之和(AC)

Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that

LeetCode【167. 两数之和 II - 输入有序数组】

这道题最开始想到的就是,两个for,target是两数之和,就可以target - numbers[i],比较是否有与后面数相等. class Solution { public int[] twoSum(int[] numbers, int target) { int i,j,s; int c = numbers.length; int[] t = new int[2]; for(i = 0;i <= c-1;i++) { s = target - numbers[i]; t[0] = i+1

LeetCode Two Sum 两数之和

题意:在一个整数序列中找到两个元素,他们之和为target,并用vector返回这两个元素的位置(升序),位置从1开始算起. 思路: 方法(1):两个指针法.也就是排序,然后一个从头扫,一个从尾扫,前提是先排序,但是给的数组是无序的,一旦排序就失去了他们的具体位置.如果是ACM的题还可以弄个结构体把他们打包起来,再根据值大小来排序,这样找到了也就能找到他们的位置.可是这里是在一个类里面的,用不上结构体,肯定还有其他方法 ,比如 pair,但是我还不会实现.于是,用multimap来代替,将元素值

Leetcode篇:两数之和

@author: ZZQ @software: PyCharm @file: addTwoNumbers.py @time: 2018/9/18 10:35 要求:给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. e.g.: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465

python刷LeetCode:1.两数之和

难度等级:简单 题目描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1] 来源:力扣(LeetCode)链接:https://leetcode-cn.com/proble

[leetcode题解]01两数之和

给定一个整数数组 nums?和一个目标值 target,请你在该数组中找出和为目标值的那?两个?整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 分析 关键字:数组.查找.下标. 由于数组是无序的,查找必须要遍历,不能用二分查找,时间复杂度一般最小为O(n). 暴力解法:遍历

Python版[leetcode]1. 两数之和(难度简单)

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1] 一开始我的想法是直接用2个for循环遍历nums,用当前数和当前数之后的所有数求和,如果和target相同就直接返回当前索引

LeetCode题目:两数之和2

题目描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 解法1:class Solution {    public int[] twoSum(int[] numbe