TwoSun问题的两种解决办法

问题描述:给出一个数组{2,9,3,1,4,5,4},请问其中是否存在两个数字相加之和为9,如果存在则打印结果

解决方案:

                 1.暴力for循环:进行两次遍历,外层for循环选择一个数字,并在此基础上再选择内层for循环的数字,然后验证选择的两个数字是否相加为9. 该方法的时间复杂度为O(n2)

                   实现代码:

  1. import java.util.HashSet;
  2. /**
  3.  * 给定一个数组,问是否存在两个数使得相加的结果为9
  4.  * 使用方法:暴力for循环
  5.  *
  6.  */
  7. public class Method1 {
  8.     public static void main(String[] args) {
  9.         //定义一个数组 
  10.         int a[]={2,9,3,1,4,5,4};
  11.         //目标
  12.         int target=9;
  13.         //HashSet存放结果
  14.         HashSet<String> set=new HashSet<>();
  15.          for(int i=0,len=a.length;i<len;i++){
  16.             for(int k=i+1;k<len;k++){
  17.                 //string ,string2 目的是去除重复的组合
  18.                 String string=(a[i]+","+a[k]);
  19.                 String string2=(a[k]+","+a[i]);
  20.                 if(a[i]+a[k]==target&&!set.contains(string)&&!set.contains(string2)){
  21.                      set.add(string);
  22.                 }
  23.             }
  24.          }
  25.          //遍历结果
  26.          for(String s:set){
  27.              System.out.println(s);
  28.          }
  29.     }
  30. }
     

                2.运用一层for循环解决:我们知道,假设有x,y两个数字,求其和为9。则有y=9-x;然后查看y是否在给出的数组中,如果存在,则打印该组合。

                   实现代码:

              

  1. import java.util.HashSet;
  2. public class Method2 {
  3. public static void main(String[] args) {
  4.     //定义一个数组 
  5.     int a[]={2,9,3,1,4,5,4};
  6.     //目标
  7.     int target=9;
  8.     //定义hashset记录a中存在的数字
  9.     HashSet<Integer>set=new HashSet<>();
  10.     for (int i = 0; i < a.length; i++) {
  11.         set.add(a[i]);
  12.     }
  13.     //收藏结果
  14.     HashSet<String>set2=new HashSet<>();
  15.     for(int i=0,len=a.length;i<len;i++){
  16.         int x=a[i];
  17.         //得到y的表达式
  18.         int y=target-x;
  19.         //查找y是否属于a数组的元素,!set2.contains(x+","+y)&&!set2.contains(y+","+x)这个判断是为了使结果唯一
  20.         if(set.contains(y)&&!set2.contains(x+","+y)&&!set2.contains(y+","+x)){
  21.             set2.add(x+","+y);
  22.         }
  23.     }
  24.      //遍历结果
  25.      for(String s:set2){
  26.          System.out.println(s);
  27.      }
  28. }
  29. }
     

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值