算法题 兄弟们进来看看

tooh 2013-05-05 06:52:32
给一个值key,判断已知数组data中是否有这样两个元素,满足这两个数之和等于key,找到就返回true。
比如从int[] data = {1, 4, 2, 6, 5}中是否有这样的元素,找到就返回true。
...全文
315 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
JavaScript_R 2013-05-12
  • 打赏
  • 举报
回复
先排序 找出最大的两个数求和 如果大于key再进入匹配
tooh 2013-05-12
  • 打赏
  • 举报
回复
引用 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的平方了。
tooh 2013-05-12
  • 打赏
  • 举报
回复
引用 12 楼 dracularking 的回复:
[quote=引用 9 楼 HMC20071120015 的回复:] [quote=引用 2 楼 chemeilun 的回复:] 遍历查找key-arr[i]可以吗?
可以 但是面试官感觉不算好,他的意思是用map,估计可以达到O(1)的时间复杂度吧[/quote] 4楼的如果list转换成map,但O(n)还是要的[/quote] 嗯嗯
tooh 2013-05-12
  • 打赏
  • 举报
回复
引用 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)~)
好思路啊
齐岳 2013-05-09
  • 打赏
  • 举报
回复
引用 7 楼 oh_Maxy 的回复:
算法思路:
这个算法没有考虑 负数吧。(-2)+4 =2,你怎么找
新铺村长 2013-05-09
  • 打赏
  • 举报
回复
引用 13 楼 qiyuexuel 的回复:
[quote=引用 7 楼 oh_Maxy 的回复:] 算法思路:
这个算法没有考虑 负数吧。(-2)+4 =2,你怎么找[/quote] 负数没有影响吧
新铺村长 2013-05-09
  • 打赏
  • 举报
回复
引用 4 楼 a312983516 的回复:
把int[] data = {1, 4, 2, 6, 5}再复制一份list集合

for(int i:data){
   if(list.contains(String.valueOf(key-i))){      
       return true;
   }
}
这个主意还是不错 map怎么用的上呢?
新铺村长 2013-05-09
  • 打赏
  • 举报
回复
引用 17 楼 qiyuexuel 的回复:
[quote=引用 15 楼 Yweige2010 的回复:] 负数没有影响吧
遍历data数组,将小于key的值,插入排序到数组data2中 如果是(-2)和4在原数组中,key为2,那么4就不会放到data2中了 然后----------[/quote] 恩恩 这个地方是要改下 看错了 sorry
齐岳 2013-05-09
  • 打赏
  • 举报
回复
引用 15 楼 Yweige2010 的回复:
负数没有影响吧
遍历data数组,将小于key的值,插入排序到数组data2中 如果是(-2)和4在原数组中,key为2,那么4就不会放到data2中了 然后----------
  • 打赏
  • 举报
回复

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)~)
dracularking 2013-05-08
  • 打赏
  • 举报
回复
引用 9 楼 HMC20071120015 的回复:
[quote=引用 2 楼 chemeilun 的回复:] 遍历查找key-arr[i]可以吗?
可以 但是面试官感觉不算好,他的意思是用map,估计可以达到O(1)的时间复杂度吧[/quote] 4楼的如果list转换成map,但O(n)还是要的
andycpp 2013-05-08
  • 打赏
  • 举报
回复
无重复数据,均为正数,可以用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;
	}
tooh 2013-05-08
  • 打赏
  • 举报
回复
引用 4 楼 a312983516 的回复:
把int[] data = {1, 4, 2, 6, 5}再复制一份list集合

for(int i:data){
   if(list.contains(String.valueOf(key-i))){      
       return true;
   }
}
貌似这个是个好主意,不过也是遍历查找了
tooh 2013-05-08
  • 打赏
  • 举报
回复
引用 2 楼 chemeilun 的回复:
遍历查找key-arr[i]可以吗?
可以 但是面试官感觉不算好,他的意思是用map,估计可以达到O(1)的时间复杂度吧
tooh 2013-05-08
  • 打赏
  • 举报
回复
引用 1 楼 usingnamespace_std 的回复:
先排序,然后遍历data中的值 for(int i=0; i<data.length(); i++) { 二分查找(key-data[i]) 如果找到 return true } 时间复杂度 nlogn
恩 我当时也这么想的 老板觉得可以优化,他的意思是用map,可是我怎么想也运用不上
oh_Maxy 2013-05-07
  • 打赏
  • 举报
回复
算法思路: 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),暂时没想到好方法。
Jackie_Zhu 2013-05-06
  • 打赏
  • 举报
回复
引用 2 楼 chemeilun 的回复:
遍历查找key-arr[i]可以吗?
可以,只是总的时间复杂度变成了O(n^2)
Jackie_Zhu 2013-05-06
  • 打赏
  • 举报
回复
引用 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)的吧
a312983516 2013-05-06
  • 打赏
  • 举报
回复
把int[] data = {1, 4, 2, 6, 5}再复制一份list集合

for(int i:data){
   if(list.contains(String.valueOf(key-i))){      
       return true;
   }
}
大笨熊托尼 2013-05-06
  • 打赏
  • 举报
回复
有必要排序吗?如果元素多了,排序就够慢的
加载更多回复(2)

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧