校招准备系列:每天一道算法题(5)-两数之和

来源:互联网 发布:fedora17 yum无法使用 编辑:程序博客网 时间:2024/05/20 02:28

校招准备系列:每天一道算法题(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,想到这这道题目就差不多了。。。

阅读全文
1 0
原创粉丝点击