当前位置:编程学习 > JAVA >>

算法题 兄弟们进来看看

给一个值key,判断已知数组data中是否有这样两个元素,满足这两个数之和等于key,找到就返回true。
比如从int[] data = {1, 4, 2, 6, 5}中是否有这样的元素,找到就返回true。 算法 --------------------编程问答-------------------- 先排序,然后遍历data中的值
 for(int i=0; i<data.length(); i++)
 {
      二分查找(key-data[i])
         如果找到 return true
 }

时间复杂度 nlogn --------------------编程问答-------------------- 遍历查找key-arr[i]可以吗? --------------------编程问答-------------------- 有必要排序吗?如果元素多了,排序就够慢的 --------------------编程问答-------------------- 把int[] data = {1, 4, 2, 6, 5}再复制一份list集合


for(int i:data){
   if(list.contains(String.valueOf(key-i))){      
       return true;
   }
}
--------------------编程问答--------------------
引用 4 楼 a312983516 的回复:
把int[] data = {1, 4, 2, 6, 5}再复制一份list集合


for(int i:data){
   if(list.contains(String.valueOf(key-i))){      
       return true;
   }
}

contains这个函数式o(n)的吧 --------------------编程问答--------------------
引用 2 楼 chemeilun 的回复:
遍历查找key-arr[i]可以吗?

可以,只是总的时间复杂度变成了O(n^2) --------------------编程问答-------------------- 算法思路:
1. 遍历data数组,将小于key的值,插入排序到数组data2中(data2升序,考虑到小于key值的数个数不确定,要么定义成LinkedList,要么在循环条件处,增加判断当前i或j对应的值为合法值)。
2. 两重循环data2(i=0,j=i+1那种形式),做如下判断:
   a. 若data2[i]+data2[j]==key,直接返回true;
   b. 若data2[i]+data2[j]>key,直接break内层循环;
3. 返回false。

复杂度O(n^2),暂时没想到好方法。

--------------------编程问答--------------------
引用 1 楼 usingnamespace_std 的回复:
先排序,然后遍历data中的值
 for(int i=0; i<data.length(); i++)
 {
      二分查找(key-data[i])
         如果找到 return true
 }

时间复杂度 nlogn

恩 我当时也这么想的 老板觉得可以优化,他的意思是用map,可是我怎么想也运用不上 --------------------编程问答--------------------
引用 2 楼 chemeilun 的回复:
遍历查找key-arr[i]可以吗?

可以 但是面试官感觉不算好,他的意思是用map,估计可以达到O(1)的时间复杂度吧 --------------------编程问答--------------------
引用 4 楼 a312983516 的回复:
把int[] data = {1, 4, 2, 6, 5}再复制一份list集合


for(int i:data){
   if(list.contains(String.valueOf(key-i))){      
       return true;
   }
}


貌似这个是个好主意,不过也是遍历查找了 --------------------编程问答-------------------- 无重复数据,均为正数,可以用Set吧
	private static boolean find(int[] a, int key) {
Set<Integer> set = new HashSet<>();
for(int x:a) {
set.add(x);
}
boolean result = false;
for(int i = 1; i<key/2; i++) {
if(set.contains(i) && set.contains(key-i)) {
result = true;
break;
}
}
return result;
}
--------------------编程问答--------------------
引用 9 楼 HMC20071120015 的回复:
Quote: 引用 2 楼 chemeilun 的回复:

遍历查找key-arr[i]可以吗?

可以 但是面试官感觉不算好,他的意思是用map,估计可以达到O(1)的时间复杂度吧

4楼的如果list转换成map,但O(n)还是要的 --------------------编程问答--------------------
引用 7 楼 oh_Maxy 的回复:
算法思路:

这个算法没有考虑 负数吧。(-2)+4 =2,你怎么找 --------------------编程问答--------------------
引用 4 楼 a312983516 的回复:
把int[] data = {1, 4, 2, 6, 5}再复制一份list集合


for(int i:data){
   if(list.contains(String.valueOf(key-i))){      
       return true;
   }
}


这个主意还是不错 map怎么用的上呢? --------------------编程问答--------------------
引用 13 楼 qiyuexuel 的回复:
Quote: 引用 7 楼 oh_Maxy 的回复:

算法思路:

这个算法没有考虑 负数吧。(-2)+4 =2,你怎么找


负数没有影响吧
--------------------编程问答--------------------

n = arr.length;
for(int i=0; i<n; i++) {
  for(int j=i+1; j<n; j++) {
    if(arr[i] + arr[j] == key) return true;
  }
}

纯算法,不用MAP/SET等数据结构,时间复杂度为N减1后的阶加:O((n-1)~) --------------------编程问答--------------------
引用 15 楼 Yweige2010 的回复:
负数没有影响吧

遍历data数组,将小于key的值,插入排序到数组data2中
如果是(-2)和4在原数组中,key为2,那么4就不会放到data2中了
然后---------- --------------------编程问答--------------------
引用 17 楼 qiyuexuel 的回复:
Quote: 引用 15 楼 Yweige2010 的回复:

负数没有影响吧

遍历data数组,将小于key的值,插入排序到数组data2中
如果是(-2)和4在原数组中,key为2,那么4就不会放到data2中了
然后----------


恩恩 这个地方是要改下 看错了 sorry --------------------编程问答--------------------
引用 16 楼 xcz_scdn 的回复:

n = arr.length;
for(int i=0; i<n; i++) {
  for(int j=i+1; j<n; j++) {
    if(arr[i] + arr[j] == key) return true;
  }
}

纯算法,不用MAP/SET等数据结构,时间复杂度为N减1后的阶加:O((n-1)~)

好思路啊  --------------------编程问答--------------------
引用 12 楼 dracularking 的回复:
Quote: 引用 9 楼 HMC20071120015 的回复:

Quote: 引用 2 楼 chemeilun 的回复:

遍历查找key-arr[i]可以吗?

可以 但是面试官感觉不算好,他的意思是用map,估计可以达到O(1)的时间复杂度吧

4楼的如果list转换成map,但O(n)还是要的

嗯嗯  --------------------编程问答--------------------
引用 16 楼 xcz_scdn 的回复:

n = arr.length;
for(int i=0; i<n; i++) {
  for(int j=i+1; j<n; j++) {
    if(arr[i] + arr[j] == key) return true;
  }
}

纯算法,不用MAP/SET等数据结构,时间复杂度为N减1后的阶加:O((n-1)~)

不过这个时间复杂度是n的平方了。 --------------------编程问答-------------------- 先排序
找出最大的两个数求和
如果大于key再进入匹配
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,