校招准备系列:每天一道算法题(5)
PS:计划赶不上变化 一脸懵逼!
今天的题目源自《Leetcode》
两数之和:给定一个整型数组 是否能找出其中的两个数使得其和为某个指定的值
关于这个题,根据题目的意思来即可,最简单的方法就是暴力破解了,我就直接贴代码吧!
package com.charpt.array;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;
/*
* 两数之和:给定一个整型数组 是否能找出其中的两个数使得其和为某个指定的值
*/
public class Sum {
public static void main(String[] args) {
int a[] = {1,5,7,3,5};
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
findNum(a,n);
}
// 暴力破解 时间复杂度为o(n2)
private static void findNum(int a[],int n){
int sum;
int count = 0;
for (int i = 0; i < a.length-1; i++) {
for (int j = i+1; j < a.length; j++) {
sum = a[i]+a[j];
if (sum == n) {
count++;
System.out.println("第"+count+"组数的下标依次为:"+i+" "+j);
}
}
}
}
// 通过排序 将时间复杂度降到nlogn
private static boolean hasSum(int a[],int n){
boolean flag = false;
if (a == null || a.length<2) {
return flag;
}
Arrays.sort(a);
int i = 0,j = a.length-1;
while(i<j){
if (a[i]+a[j] == n) {
flag = true;
break;
}else if (a[i]+a[j]>n) {
j--;
}else {
i++;
}
}
return flag;
}
// 题目升级版:给定一个整型数组 找出其中的两个数使得其和为某个指定的值 并返回这两个数的下标 假设数组中数个各不相同
// 并且要求 时间复杂度 o(n)
int [] twoSum(int a[],int n){
int[] res = {-1,-1};
if (a==null || a.length<2) {
return res;
}
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < a.length; i++) {
map.put(a[i], i);
}
for (int i = 0; i < a.length; i++) {
if (map.containsKey(n-a[i]) && n!=2*a[i]) {
res[0] = i;
res[1] = map.get(n-a[i]);
break;
}
}
return res;
}
}
关于题目的升级版,由于对时间复杂度有了要求,所以暴力破解和排序的方法都是不可取的,我们知道,要想找数 必须有一个遍历的过程 那么遍历的时间复杂度就是 o(n),所以我们必须使得查找的时间为常数,那么就想到哈希表了,所以这里用到了HashMap,想到这这道题目就差不多了。。。