1. package com.algorithm.hash;
    2. public class alg1 {
    3. public static void main(String argv[]) {
    4. int[] array1 = {10,2,7,4,5,6,3,8,9,1};
    5. int[] array2 = {1,2,3,4,5,6,7,8,9,10};
    6. int[] array3 = {1,2,3,4,5,6,7,8,9,10};
    7. alg1.execute1(array1, 8);
    8. alg1.execute2(array2, 8);
    9. alg1.execute3(array3, 8);
    10. }
    11. //思路:使用hash表存储数组各元素是否存在的标志,然后遍历数组,判断sum与当前数组元素的差值是否在hash表中,
    12. //若为真则打印,该算法不要求数组有序,但要求一个hash数组的额外空间,时间复杂度是O(n)
    13. private static void execute1(int[] array, int m) {
    14. int size = array.length;
    15. int hash[] = new int[size];
    16. for(int i = 0; i < size; i++) {
    17. hash[array[i]%size] = 1;
    18. }
    19. for(int i = 0; i < size; i++) {
    20. int tmp = m - array[i];
    21. if((tmp > array[i]) && (hash[tmp%size] == 1)){
    22. System.out.println(array[i] + " " + tmp);
    23. }
    24. }
    25. }
    26. //思路:该方法的前提是要求数组是有序的,然后再遍历数组,判断sum与数组元素的差值是否在数组中,由于数组有序所以可以采用二分查找的方法
    27. //二分查找的时间复杂度为O(logn),排序的时间复杂度是O(nlogn),查找n次,总的时间复杂度为O(nlogn),避免了空间的浪费
    28. private static void execute2(int[] array, int m) {
    29. for(int i = 0; i < array.length; i++) {
    30. int tmp = m - array[i];
    31. if (tmp > array[i]) {
    32. if (binarySearch(array, tmp) != -1) {
    33. System.out.println(array[i] + " " + tmp);
    34. }
    35. }
    36. }
    37. }
    38. private static int binarySearch(int[] array, int key) {
    39. if (array.length == 0) {
    40. return -1;
    41. }
    42. int first = 0;
    43. int last = array.length -1;
    44. int mid;
    45. while(first <= last) {
    46. mid = (first + last) / 2;
    47. if (array[mid] == key) {
    48. return mid;
    49. } else if (array[mid] < key) {
    50. first = mid + 1;
    51. } else {
    52. last = mid -1;
    53. }
    54. }
    55. return -1;
    56. }
    57. //思路:该方法的前提是要求数组是有序的,使用两个指针,分别指向最后一个元素和第一个元素,判断它们的和是否等于sum,若等于则打印,并且first向前移动,last也向前移动
    58. //若它们的和小于sum,则说明first太小了,需要first向前移动,若它们的和大于sum,则说明last太大了,需要last向前移动,直到last>=first
    59. private static void execute3(int[] array, int m) {
    60. int first = 0;
    61. int last = array.length -1;
    62. int sum = 0;
    63. while(first < last ) {
    64. sum = array[first] + array[last];
    65. if (sum == m) {
    66. System.out.println(array[first] + " " + array[last]);
    67. first++;
    68. last--;
    69. } else if (sum < m) {
    70. first++;
    71. } else {
    72. last--;
    73. }
    74. }
    75. }

java实现 数组中两个元素相加等于指定数的所有组合的更多相关文章

  1. Java 找到数组中两个元素相加等于指定数的所有组合

    思路1:可以用hash表来存储数组中的元素,这样我们取得一个数后,去判断sum - val 在不在数组中,如果在数组中,则找到了一对二元组,它们的和为sum,该算法的缺点就是需要用到一个hash表,增 ...

  2. 交换数组中两个元素的位置,元素包括key和value 一维数组

    /*author: yangyu@sina.cndescription: 交换数组中两个元素的位置,元素包括key和value,具体用法见下面的例子*/$arr = array(11=>'a', ...

  3. NlogN复杂度寻找数组中两个数字和等于给定值

    算法导论:22页2.3-7 描述一个运行时间为O(nlogn)的算法,找出n个元素的S数组中是否存在两个元素相加等于给定x值 AC解: a=[1,3,6,7,9,15,29] def find2sum ...

  4. 2016网易实习生编程题:数组中两个数的和等于sum

    题目 找出数组中两个数的和等于sum的这两个数 解题 这个题目做过很多次了,利用HashMap,key为 sum-A[i] value为 i 当 加入HashMap时候A[i] 已经存在map中,ge ...

  5. java去除数组中重复的元素方法总结

    /* * ArrayUnique.java * Version 1.0.0 * Created on 2017年12月16日 * Copyright ReYo.Cn */ package reyo.s ...

  6. Java 向数组中添加一个元素

    方法 一般数组是不能添加元素的,因为他们在初始化时就已定好长度了,不能改变长度. 向数组中添加元素思路: 第一步:把 数组 转化为 集合 list = Arrays.asList(array); 第二 ...

  7. LeetCode:1_Two_Sum | 两个元素相加等于目标元素 | Medium

    题目: Given an array of integers, find two numbers such that they add up to a specific target number. ...

  8. Java泛型01--任意数组中两元素交换

    package com.zl.generic; /** * 交换“任意”数组 中两个元素 */ public class GenericSwapArray { public static void m ...

  9. 寻找两个数组中的公共元素Java程序代码

    package lianxi; import java.util.*; public class UnionSearch { public static void main(String[] args ...

随机推荐

  1. lzugis——Arcgis Server for JavaScript API之POI

    POI(Point Of Interest),感兴趣点,其实呢,严格意义上说应该不是POI,但是单位就这样叫了,我也就这样叫了,其实现的功能大致是这样的:用过百度地图的朋友们都知道你在百度地图时,当鼠 ...

  2. windows C++ 全局异常捕捉函数

    windows 核心编程中讲过 SEH 结构化异常处理 ::SetUnhandledExceptionFilter(MyUnhandledExceptionFilter); LONG WINAPI M ...

  3. (十二)break,continue

    class Break { //break,continue public static void main(String[] args) { //break for(int i =0;i<=5 ...

  4. bzoj 3501 PA2008 Cliquers Strike Back——贝尔数

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3501 用贝尔三角形 p^2 地预处理 p 以内的贝尔数.可以模(mod-1)(它是每个分解下 ...

  5. 洛谷 1291 [SHOI2002]百事世界杯之旅

    题目:https://www.luogu.org/problemnew/show/P1291 大水题!套路!模板! 稍微注意一下输出就行了. #include<iostream> #inc ...

  6. 64位linux下rpm安装mysql的5.5.55版本

    昨天同事开了个阿里云环境,让我帮他安装mysql数据库,本想着很简单的一件事,结果还是折腾了一番.坑很多,一路趟过,一个接一个,只能硬着头皮冲. 首先是下载压缩包,因为采用了rpm安装方式,所以下载的 ...

  7. @Override注解在Eclipse中编译报错

    导入新工程后,发现默认用的jre是1.5版本的,在Eclipse中右击工程选择Build Path->点击Configure Build Path->Java Build Path-> ...

  8. Eclipse里git提交冲突rejected – non-fast-forward

    Eclipse里commit代码,其实只是提交到本地仓库,需要push才会提交到远程的git仓库,这时是一个本地仓库到远程仓库的同步过程.Git是分布式的,每个人在本地仓库维护本地的自己的那一份代码, ...

  9. linux启动自动挂载分区和/etc/fstab简单修复

    让后加的分区能够启动时自动挂载,需要把配置写入文件 /etc/fstab vi /etc/fstab UUID=3f5859e0-592f-42cd-b533-570422fb85be   / ext ...

  10. VM 修改 virtualHW.version

    1.修改BT5R3-GNOME-VM-32.vmdk文件 将encoding="windows-1252"修改为encoding="GBK" 将ddb.virt ...