leetCode算法1——求和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]


解析:

(1)我的方式:暴力解决法
两个元素求和等于目标元素,嵌套for直接搞定
class Solution {
    public int[] twoSum(int[] nums, int target) {
        int l = nums.length;
         for(int i=0;i<l;i++) {
            for(int j=i+1;j<l;j++) {
                if (nums[i] + nums[j] == target) {
                    return new int[]{nums[i], nums[j]};
                }                
            }
        }
        return null;        
    }
}

此方法时间复杂度O(n^2)

(2)其他方式(这种方式我没有想到,作为一名菜鸟,除了暴力解决,貌似想不到其他好方法)
可以使用索引,查找效率提高

class Solution {
    public int[] twoSum(int[] nums, int target) {
       return getSum(nums, target);
    }

     public int[] getSum(int[] nums, int target) {
       Map<Integer,Integer> map = new HashMap<>();
       for(int i=0;i<nums.length;i++) {
           map.put(nums[i], i);
           //注意,这里map存储时,需要数组元素做K,角标作V, 
           //因为要判断这样的元素是否存在,索引设为K更合理,输出时需要输出索引,直接getKey()即可
       }

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

此种方式的时间复杂度为O(n), 牺牲了空间 ,空间复杂度O(n)

(3) 第二种方式的优化
第二种方式可以合并一次for循环即可


class Solution {
    public int[] twoSum(int[] nums, int target) {
       return getSum(nums, target);
    }

     public int[] getSum(int[] nums, int target) {
       Map<Integer,Integer> map = new HashMap<>();
       for(int i=0;i<nums.length;i++) {
           int temp = target - nums[i];
          
           if(map.containsKey(temp)) {
               return new int[]{map.get(temp), i};
           }
            map.put(nums[i], i);
       }     
       return null;       
    }
}

这里两个值A和B,每次先查询B对应得A是不是已经在Map里,如果没有再插入B到map中,  不需要先插入map在查询
索引打印返回时,先返回已经存在的索引,在返回当前索引,保证索引顺序,所以new int[]{map.get(temp), i} 不能new int[]{i, map.get(temp)}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值