今天2021年2月2日,看了03-07,心情阴,天气晴,先整理一小节。
题目回顾: 在一个数组中,找出两个数之和为target,返回两个数的下标。
例如:data[2,7,11,13,15] 找出两数之和为target=9
输出:0,1
算法复杂度:O(1) >O(log2 n) > O(n) >O(n2)
package com.lzr.interview;
import java.util.HashMap;
import java.util.Map;
public class TwoSum {
//1.暴力求解 算法复杂度O(N的2次方)
public static int[] Sum1(int[] nums,int target){
for(int i=0;i< nums.length;i++)
for(int j=i+1;j< nums.length;j++){
if(nums[j]==target-nums[i]){
return new int[]{i,j};
}
}
return null;
}
//2.优化 O(N) 此题未考虑如果存在多个重复的值与该数之和为target
public static int[] Sum2(int[] nums,int target){
Map<Integer,Integer> map=new HashMap<Integer, Integer>();//k-v map默认空
int keynumber=0;
for(int i=0;i<nums.length;i++){
keynumber=target-nums[i];
if(map.containsKey(keynumber)){
return new int[]{map.get(keynumber),i};//第二次遍历,map中存在着一个2和当前的7之和为9,返回2的下标和当前下标1
}
map.put(nums[i],i);//第一次遍历,num[0]=2,0存入
}
return null;
}
public static void main(String[] args) {
int[] nums = {2,7,11,13,15};
int target = 9;
int[] points = Sum2(nums, target);
for(int point:points){
System.out.println(point);
}
}
}