网站介绍医院文化建设,公司注册地址可以变更到外省吗,国家icp备案查询系统,个人网站怎么做有创意两数之和 给定一个整数数组 nums 和一个整数目标值 target#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数#xff0c;并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是#xff0c;数组中同一个元素在答案里不能重复出现。你可以按任意顺序… 两数之和 给定一个整数数组 nums 和一个整数目标值 target请你在该数组中找出 和为目标值 target 的那 两个 整数并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。 之前做过这道题看到这道题我的脑海里出现三个粗略的想法。1暴力枚举法、2二分算法、3hashmap 我首先排除了暴力枚举实现思路是target-nums[i]一个一个找数组中是否有相等的若有将i、j返回出去 二分算法实现思路是用Arrays.sort将数组进行排序将target-nums[i]设为目标值然后两个指针第一个指针指向i1位置最后一个指针指向末尾二分查找 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} 实现代码
class Solution {public int[] twoSum(int[] nums, int target) {HashMapInteger,Integer map new HashMap();for(int i0;inums.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 hashmapkey、value都可为null但key不可重复value可重复线程不安全无序 linkedhashmapkey、value都可为nullkey不可重复value可重复线程不安全有序按照输入顺序输出 treemapkey不可为nullvalue可以为null若key可以排序那么按照自然顺序排序升序 concurrenthashmapkey、value都不能为null线程安全 hashtablekey、value都不能为null线程安全
以下是我二月份的时候对这道题的思考看来还是有点成长的。 添加链接描述