力扣简单1道_两数之和

  1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。

之前做过这道题,看到这道题我的脑海里出现三个粗略的想法。1暴力枚举法、2二分算法、3hashmap

我首先排除了暴力枚举 ,实现思路是:target-nums[i],一个一个找数组中是否有相等的,若有,将i、j返回出去
二分算法 ,实现思路是,用Arrays.sort将数组进行排序,将target-nums[i]设为目标值,然后两个指针,第一个指针指向i+1位置,最后一个指针指向末尾,二分查找
hashmap ,我先将数组中的下标和对应的值存进hashmap里,循环遍历次数为nums.length,在循环里先得到key->i,value->get(i);然后remove(i),调用containsValue(target-get(i)),false返回new int[0],并且将remove的元素添加回去;这里有个小问题,如果是true,那么怎么得到true的这个value的key呢?假设我们得到了,返回new int[]{i,key}
很显然,我们得不到这个key,那么反过来想呢?将hashmap的key和value反过来存储,这里又有一个问题,hashmap的key唯一,但显然nums数组里面可能会存在两个相同的元素,所以hashmap显然不行。

我们知道map的key必须唯一不可重复,所以说这个思路走不通。

既然把元素存进去然后查找是否存在某个value行不通(我们不知道对应的key),换个思路,我们可以寻找某个key是否存在,key存nums[i],value存i,那么如果存在,可以返回 new int[]{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.containsKey(target-nums[i])){
                return new int[]{i,map.get(target-nums[i])};
            }else{
                map.put(nums[i],i);
            }
        }
        return new int[0];
    }
}


我们看这个map的结构图,可以知道key-value形式的除了hashmap还有linkedhashmap、treemap、concurrenthashmap以及hashtable

hashmap:key、value都可为null,但key不可重复,value可重复,线程不安全,无序

linkedhashmap:key、value都可为null,key不可重复,value可重复,线程不安全,有序(按照输入顺序输出)

treemap:key不可为null,value可以为null,若key可以排序,那么按照自然顺序排序,升序

concurrenthashmap:key、value都不能为null,线程安全,

hashtable:key、value都不能为null,线程安全

以下是我二月份的时候对这道题的思考,看来还是有点成长的。
添加链接描述

相关推荐
庞轩px3 分钟前
第七篇:Spring扩展点——如何优雅地介入Bean的创建流程
java·后端·spring·bean·aware·扩展点
孬甭_1 小时前
初识数据结构与算法
数据结构
tongluowan0072 小时前
一个请求在Spring MVC 中是怎么流转的
java·spring·mvc
hoiii1872 小时前
孤立森林 (Isolation Forest) 快速异常检测系统
算法
夜郎king2 小时前
Spring AI 对接大模型开发易错点总结与实战解决办法
java·人工智能·spring
oradh2 小时前
Oracle数据库中的Java概述
java·数据库·oracle·sql基础·oracle数据库java概述
组合缺一3 小时前
Java AI 框架三国杀:Solon AI vs Spring AI vs LangChain4j 深度对比
java·人工智能·spring·ai·langchain·llm·solon
c++之路3 小时前
适配器模式(Adapter Pattern)
java·算法·适配器模式
吴声子夜歌3 小时前
Java——接口的细节
java·开发语言·算法
阿拉金alakin3 小时前
深入理解 Java 锁机制:CAS 原理、synchronized 优化与主流锁策略全总结
java·开发语言