算法是每个程序员的必修课,以前也认为做个普通的开发,要懂什么算法和数据结构,现在发现好点的公司算法和数据结构都是必须要问的,而且多学算法对自己的思维扩展是有很大的提高,再说现在求职这么难,不是4 5年前那个美好的时候了,所以要每天学点算法积累下,当然不太可能做到算法工程师那种了
今天的题目是求数组中要求二个数组相加等于某个数,然后求出这二个值的下标,这题还是算简单的
题目描述
给定一个整数数组和一个目标整数,该目标整数满足数组中两元素之和,返回数组中两个数字的下标索引,
例如给定数组int[] nums = [2, 7, 11, 15],目标整数int target = 9,因为 nums[0] + nums[1] = 2 + 7 = 9,返回包含两数索引分别是0和1
思路
先对数组进行for循环,拿出一个数,再进行一个里层循环,拿出每个数组中的数据进行操作
第一种方案
package com.zgz.search;
public class TwoSumDemo {
public static void main(String[] args) {
int[] nums = new int[]{2, 7, 11, 15};
sum(nums,18);
}
private static void sum(int[] arr, int target){
if(arr==null||arr.length==0){
return;
}
for(int i=0;i<arr.length;i++){
int firstValue = arr[i];
int value = target-firstValue;
for(int j=1;j<arr.length;j++){
if(arr[j]==value){
System.out.println("i="+i);
System.out.println("j="+j);
return;
}
}
}
}
}
这种算法的时间复杂度为O(n^2),那么有没有更优秀的解算呢?答案是有的
第二种方案
分析这个数组[2, 7, 11, 15],我们可以利用Map集合,key是数组中的数值,value是数组对应的下标值,这样就不用双层for 循环了,它的时间复杂度就是O(n)
public static int[] sum2(int[] nums, int target) {
int[] result = new int[2];
if (nums.length < 2) {
return null;
}
Map<Integer, Integer> map = new HashMap<>();
for (int i=0; i<nums.length; i++) {
int num = target - nums[i];
if (map.containsKey(num)) {
result[0] = map.get(num);
result[1] = i;
}
map.put(nums[i], i);
}
System.out.println("map="+map);
return result;
}
分析:求和等于18
当i=0,num=16 if条件判断不成立,然后把存在map集合中,这个时候map集合的值是:[2-0]
当i=1,num=11,if条件判断不成立,然后存储到map集合中,这个时候map集合的就变为:map[2-0,7-1]
当i=2,num=7 if条件判断成立,resule数组的第一个元素值=map.get(num)=1 result数组的第二个元素值就是当前数组的下标了,就是2,
这个方案就是使用了一次for循环,效率要比第一个效率高点.