1. Two Sum

来源:互联网 发布:java替换\ 编辑:程序博客网 时间:2024/06/15 20:37

题目

给定一个整数数组和一个指定的值,返回数组中两个元素的索引值,这两个元素需要满足相加等于这个指定的值。

您可以假设每个输入都仅有一个解决方案,不能使用相同的元素两次。

Example

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,

return [0, 1].

解答思路

本题的难点在于不能使用相同的元素两次,所以,时间复杂度要求是O(n)。既然知道了题目的要求,下面就简单了。

我有一种思路:就是利用空间换时间。

由于数组不便于查找指定元素,所以,我想到了定义一个List集合,将数组中的元素存入List集合中。然后再遍历数组,如果target为指定的值,且当前元素是nums[i],则可以很快的判断List中是否存在值为(target-nums[i])的元素。

下面则是该思路的Java程序:

 public int[] twoSum(int[] nums, int target) {        List list = new ArrayList();        int[] index = new int[2];        for(int i = 0;i < nums.length;i++){            list.add(nums[i]);        }        for(int i = 0;i < nums.length;i++){            int temp = target - nums[i];            if(list.contains(temp) && (list.indexOf(temp) != i)){//避免当target-nums[i]=nums[i]时,选出的两个值为同一个元素                int k = list.indexOf(temp);                index[0] = Math.min(i,k);//返回的索引是从小到大的                index[1] = Math.max(i,k);                return index;            }        }        if(index.length == 0)           throw new IllegalArgumentException("No solution");        return index;    }

由程序可以看出,该算法的时间复杂度最大为O(n),空间复杂度为O(n)

原创粉丝点击