两个数组分别取出一个来相加,找出和最小的k个
2012-10-07 22:52
363 查看
【特别注意】:这个方法有问题,正确的方法是用堆实现,最近比较忙,没时间写代码,过一段时间补上。
/** * 两个数组a1和a2,大小都为k。 * 有两个序列A和B,A=(a1,a2,...,ak),B=(b1,b2,...,bk),A和B都按升序排列, * 对于1<=i,j<=k,求k个最小的(ai+bj),要求算法尽量高效。 */ #include <stdio.h> #define M 6 #define N 8 int a1[M] = {1,3,5,6,9,10}; int a2[M] = {2,2,3,3,5,11}; int x = 0; int y = 0; int result = {0}; int min(int a, int b){ return a<b?a:b; } int main(){ int i = 0; int h = 1; int index = 0; int max_index = 5; result[index++] = a1[x]+a2[y]; while(1){ //固定x,y先前走,直到和大于a[x+1][y] h = 1; while(a1[x] + a2[y+h] <= a1[x+1] + a2[y]){ result[index++] = a1[x] + a2[y+h]; if(index == max_index) break; h++; } result[index++] = a1[x+1] + a2[y]; if(index == max_index) break; x++; //固定y,x先前走,直到和大于a[x][y+1] h = 1; while(a1[x+h] + a2[y] <= a1[x] + a2[y+1]){ result[index++] = a1[x+h] + a2[y]; if(index == max_index) break; h++; } result[index++] = a1[x] + a2[y+1]; if(index == max_index) break; y++; } printf("结果是:\n"); for(i=0;i<5;i++) printf("%d ",result[i]); return 0; }
运行结果:
相关文章推荐
- 写一个功能函数实现从数组中找出两个值相加等于某一个值,要求时间复杂度为 n;
- 一个数组中只有两个数字单独出现,其余数字都是成对出现的,请找出这两个数。
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现
- 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
- 快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值
- [算法学习]给定一个整型数组,找出两个整数为指定整数的和(2)
- C语言- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次,找出这两个数字,编程实现。
- 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
- 面试金典之(一)找出和为SUM的递增数组array中的两个数使之乘积最小
- 程序员面试100题之十:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值(转)
- 一个数组中两个数的和为N,找出这两个数字的下标
- 一个整型数组里除了两个数之外,其他数都出现了两次。找出这两个出现一次的数。
- 快速找出一个数组中的两个数字,使两个数之和 等于一个已给定的值
- 有一个数组内放10个整数要求找出最小的数&它的下标然后将它&数组中最前面的元素对换
- Java 如何将一个文件中的两列数据分别读到两个数组中?
- 给定一个数组,找出不在数组中的最小的那个数字
- 快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
- 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1},
- 找出数组中两个只出现一次的数字;异或运算^的一个作用