LeetCola_1_167_两数相加_0720SO

1 两数相加

public static int[] twoSum(int[] nums, int target) {

167 两数之和II输入有序数组 

public int[] twoSum(int[] numbers, int target) {

注意两道题的区别

两道题都可以用哈希表进行计算 耗时3ms

但是167 是排好序的 可以用更快的方法

Map<K,V>

containsValue(Object value)
          如果此映射将一个或多个键映射到指定值,则返回 true。
get(Object key)
          返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null
put(K key, V value)
          将指定的值与此映射中的指定键关联(可选操作)。

1

  • 建立哈希表map
  • 从0开始遍历数组
    • 建立bu等于target-numbers[i]
    • 如果bu 在map里 (map.containsKey(bu))
      • 返回一个新的int数组() 用bu的索引和第i个的索引 {map.get(bu)+1,i}
    • 如果不在map里 就把第i个放进map里 放入 值与对应的索引i map.put(numbers[i],i)
public int[] twoSum2(int[] nums, int target) {
		Map<Integer, Integer> map = new HashMap<>();
		for (int i = 0; i < nums.length; i++) {
			int complement = target - nums[i];
			if (map.containsKey(complement)) {
				return new int[]{map.get(complement), i};
			}
			map.put(nums[i], i);
		}
		throw new IllegalArgumentException("No two sum solution");
	}

167

  • // 初始时两个指针分别指向第一个元素位置和最后一个元素的位置。
  • // 每次计算两个指针指向的两个元素之和,并和目标值比较。
  • // 如果两个元素之和等于目标值,则发现了唯一解。
  • // 数组索引从0开始
  • // 如果两个元素之和大于目标值,则将右侧指针左移一位。
  • // 如果两个元素之和小于目标值,则将左侧指针右移一位。
public int[] twoSum(int[] numbers, int target) {
			int slow = 0, fast = numbers.length - 1;
			while (slow < fast) {
				int sum = numbers[slow] + numbers[fast];
				if (sum == target) {
					return new int[]{slow + 1, fast + 1};
				} else if (sum < target) ++slow;
				else --fast;
			}
			return new int[]{-1, -1};
		}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值