leetcode刷题(题号:1)

小白刷题时学习的一些解法思路及分析,如果有不对的地方可以在评论区指出或私聊,侵删

一、题目描述

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum​​​​​​

二、解题方法即代码详解

解法一:枚举法

解题思路:

使用两个for循环分别使用int型的变量记录数组下标,在if条件语句下进行判断对应两数值的和是否为答案,不相等继续调用循环语句,相等反馈输出结果。

java:

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

        }
        return new int[0];
    }
}

语句详解:

        for(int i = 0; i < nums.length; i++){

创建一个新的变量i,初始化为0,当i小于数组长度时,进入循环语句,每执行完一次循环,对i进行自加操作,使第一个指针沿数组向前移动一位。

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

内部循环创建一个新的变量j(因为不可使用同一个元素两次,即i!=j,且当j始终在i之后时,可减少重复运算)=i+1,当j小于数组长度时,进入循环,循环内有一个if判断语句,如果nums[i]+nums[j]的值与目标值相等,则执行return new int[]{i,j};,即返回一个新的数组,数组内包含所需的两个下标i和j。

当最外层的for循环均执行完后,依旧无法得到所需数组的下标,则返回一个新的空数组。

该解法使用了两层嵌套的for循环,其时间复杂度为O(n^2),空间复杂度仅开辟了两个变量,空间复杂度为O(1).

解法二:哈希查找法

后续会出一篇文章单独记录哈希表的内容,目前仅介绍当前所需使用的方法:

//新建一个HashMap对象
Map<String,Object> map = new HashMap<>();
//向map中添加键值对
map.put("key", value);
//从map中查找key并返回对应的value值
map.get("key");

或可前往菜鸟教程学习相关知识:Java HashMap | 菜鸟教程 (runoob.com)

解题思路:

创建一个哈希图,使用一个参数i作为数组下标,使用nums[i] = target-nums[x](nums[x]为目标与当前值的差)作为key值,对应的value值为i,使用哈希表每次查找的key即target-nums[i],实质上为当前nums[i]与目标的差。未查找到时将当前值插入哈希表中,查找成功则输出对应的两个数值下标(map.get(nums[i])对应的value值即为前一个数组下标。)

java:

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

语句详解:

HashMap<Integer,Integer> map=new HashMap<>();
 

该语句新建了一个空的哈希图,键及值对应的类均为int。

for(int i = 0; i < nums.length; i++){
    if(map.get(nums[i]!=null)
        return new int[]{map.get(nums[i]),i};
    else
        map.put(target-nums[i],i);
}
return new int[0];

for循环创建并初始化了一个新的变量i为0,当i小于数组长度时,进入循环,判断map图中是否有怒nums[i](即target-nums[x]的对应的键。),如果不存在,map.get(nums[i])返回null则将键值对[target-nums[i], i]放入哈希表中。当查找成功时,则创建一个新的数组,返回nums[i]作为key对应的value(数组下标),和i。如果循环跑完依然没有得到目标,则返回一个空的新数组。

时间复杂度为O(n): 最差情况for循环运行n次,每次哈希查找一次为O(1)

空间复杂度为O(n): 最差情况一个i,哈希图中n个数组和其下标组成的键值对。

如果你在阅读过程中发现错误或不懂的地方,可以在评论去中指出或私聊,感谢阅读。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值