当前位置:   article > 正文

LeetCode热题100个人学习记录

leetcode热题100

题目1两数之和

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

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

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

1、网站给出的最优解

  1. class Solution {
  2. public int[] twoSum(int[] nums, int target) {
  3. int i = 0; //数组起始下标
  4. int j = nums.length - 1; //数组最后下标
  5. Map<Integer, Integer> hash = new HashMap<>(); //建立k-v (k为值,v为该值在数组中对应的下标)
  6. while (i <= j) {//相当于创建了两个指针,直到i=j时停止取值
  7. //1)从头开始取
  8. if (hash.containsKey(nums[i])) { //判断当前值之前是否已经存储到了hash表中
  9. //如果之前已被存储,则nums[i]就等于target-另一个值,
  10. //相当于两者都已经找到了将其索引存储到index数组中
  11. int[] index = new int[]{hash.get(nums[i]),i};
  12. return index;
  13. } else{
  14. hash.put(target - nums[i], i); //保存当前值与目标值的差,与其在数组中的索引
  15. }
  16. //2)从尾开始取
  17. if (hash.containsKey(nums[j])) {
  18. int[] index = new int[]{hash.get(nums[j]),j};
  19. return index;
  20. } else{
  21. hash.put(target - nums[j], j);
  22. }
  23. i++;
  24. j--;
  25. }
  26. return null;
  27. }
  28. }

index是一个一维数组,放进去的只有索引位置;

若数组nums声明为[1,2,3,4],target = 6,从后往前遍历到4的时候就已经把<2,3>放进了map中,target - nums[3] = 2, j = 3。所以在从前往后遍历到2时,发现map中已经存在了,执行int[] index = new int[]{hash.get(nums[i]),i};这行代码,而hash.get(2)得到是在map中key=2的位置对应的value,也就是刚才存入的<2,3>中的3,其实就是j值,因此最后index数组中存入的是两个索引值。

2、解决方式二:用map存放数组,但单向遍历

  1. class Solution {
  2. public int[] twoSum(int[] nums, int target) {
  3. / //用地图存放数组,查阅起来更快速
  4. Map<Integer, Integer> map = new HashMap<Integer,Integer>();
  5. for(int i=0;i<nums.length;i++) {
  6. map.put(nums[i], i);
  7. }
  8. for(int i=0;i<nums.length;i++) {
  9. //用目标数字-当前数字就是还差多少
  10. int remainder=target-nums[i];
  11. if(map.containsKey(remainder)&&map.get(remainder)!=i) {
  12. //如果当前地图中存在这样一个数字,并且它对应的下标与当前扫描到的数字不同
  13. //说明找到了
  14. return new int[] {i,map.get(remainder)};
  15. }
  16. }
  17. return null;
  18. }
  19. }

3、解决方式一:自己写的两层for循环暴力解

  1. class Solution {
  2. public int[] twoSum(int[] nums, int target) {
  3. int[] arr = new int[2];
  4. for(int i = 0;i <= nums.length;i ++){
  5. for(int j = i + 1;j < nums.length;j++){
  6. if(nums[i] + nums[j] == target){
  7. arr[0] = i;
  8. arr[1] = j;
  9. return arr;
  10. }
  11. }
  12. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/146099
推荐阅读
相关标签
  

闽ICP备14008679号