校招准备系列:每天一道算法题(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
- 校招准备系列:每天一道算法题(5)-两数之和
- 校招准备系列:每天一道算法题(1)
- 校招准备系列:每天一道算法题(2)
- 校招准备系列:每天一道算法题(3)
- 校招准备系列:每天一道算法题(4)
- 校招准备系列:每天一道算法题(6)-连续最大和
- 校招准备系列:每天一道算法题(7)-末尾0的个数
- 校招准备系列:每天一道算法题(8)-进制转换
- 校招准备系列:每天一道算法题(9)-单例
- 校招准备系列:每天一道算法题(10)-二维数组查找
- 校招准备系列:每天一道算法题(11)-替换空格
- 校招准备系列:每天一道算法题(12)-从尾到头打印链表
- 校招准备系列:每天一道算法题(13)-斐波那契数列
- 校招准备系列:每天一道算法题(14)-合并两个排序的链表
- 校招准备系列:每天一道算法题(15)-求1+2+3+...+n
- 算法题:lintcode#56 两数之和(java)
- 算法练习:两数之和
- 算法Day1-两数之和
- 处理浏览器兼容所遇到的问题总结(二)
- MYSQL查各张表的行数
- python数据可视化利器--pyecharts
- 在网页端进行添加和删除记录的操作。
- set -x 作用
- 校招准备系列:每天一道算法题(5)-两数之和
- 利用pdfbox和itext包将pdf转换为图片
- SparkSQL---DataFrame
- Date、String、Calendar类型之间的转化
- 2017/8/3java开发日志
- Webpack+React+ES6项目搭建(一)
- hdu 6069 区间筛
- java数组中的length属性到底属于java中的哪个类
- keystore was tampered with,or password was incorrect解决办法