新人第一帖 LeetCode做题开始

朋友介绍了leetcode 这个oj网站,包含了很多程序员的试题,我去看了下,对提高算法能力很有针对性,我决定尝试开始解题历程,并和大家分享我的解题,这是第一题:

1: 给定一个int数组,和 一个 int target 值,数组中有两个值的和为target ,给出这两个值的下标,你可以认为解只有一个。

水题,以下是我的代码:

public class Solution {
    public int[] twoSum(int[] nums, int target) {
        int i=0,j = 0 ;
		for (i = 0; i < nums.length; i++) {
			for (j = i + 1; j < nums.length; j++) {
				if((nums[i]+nums[j]) == target)
					return new int[]{i,j} ;
			}	
		}
		return null;
    }
}

  O(n*n) ,这解法一般,第一次写没有想这么多,其实可以有优化的空间,看了答案可以用map解,效率提高,而且如果找不到应该抛出异常,我试着实现后如下:

class Solution2 {
	public int[] twoSum(int[] nums, int target) {
		Map<Integer,Integer> map = new HashMap<Integer,Integer>() ;
		map.put(nums[0], 0) ;
		for(int i=1; i<nums.length;i++){
			int num1= target-nums[i] ;
			if(map.containsKey(num1)){ 
				int index1 = map.get(num1);
				return new int[]{index1,i};
			}
			else map.put(nums[i], i) ;
		}
		throw new IllegalArgumentException("No solution");
	}
}

  用map 存 第一个 数, key 存 数组中的值 ,value 存 值的下标。

遍历后面的元素, 假定当前元素是num ,如果它是解 ,另一个解应该 是前面map 已经存起来的 key值,

即 map 包含 一个 key 满足: key + num = target ,满足了,则为解,可以通过map 求出 key值的下标,

当前遍历数组可得知num的下标,得出结果。暂时不满足,则<num,i> 存到map 中。挺巧妙的。

 

转载于:https://www.cnblogs.com/coderbill/p/TwoSum.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值