两个数组,求元素之间相乘的n个最小值

shuaiwang_01 2011-07-16 11:24:16
如数组
a[] = {1, 3, 5, 7}
b[] = {2, 4, 6, 8}
其元素之间最小的10个乘积为:
2,4,6,8,10,12,14,18,20,24。

我自己写算法实现了下,但是一些数字被遗漏了,如2*5=10,2*7=14.
我主要是用两个指针
i,j分别指向数组a和b,但有时指针需要回溯,这时就处理不好了,因而加了很多逻辑判断,但还是解决不了问题。
...全文
386 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wesweeky 2011-07-16
  • 打赏
  • 举报
回复
lz上代码
shuaiwang_01 2011-07-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 c_losed 的回复:]

函数名起成相反的了
[/Quote]

不是求最小值

且要求时间复杂度小于O(n^2).
shuaiwang_01 2011-07-16
  • 打赏
  • 举报
回复
如数组
a[] = {1, 3, 5, 7}
b[] = {2, 4, 6, 8}
其元素之间最小的10个乘积为:
2,4,6,8,10,12,14,18,20,24。

我自己写算法实现了下,但是一些数字被遗漏了,如2*5=10,2*7=14.
我主要是用两个指针
i,j分别指向数组a和b,但有时指针需要回溯,这时就处理不好了,因而加了很多逻辑判断,但还是解决不了问题。

时间复杂度小于O(n^2).
c_losed 2011-07-16
  • 打赏
  • 举报
回复
函数名起成相反的了
c_losed 2011-07-16
  • 打赏
  • 举报
回复

#include <stdio.h>

int big(int a[], int b[])
{
int smallnum = a[0] * b[0];

for (int i = 0; i < sizeof(a); ++i)
{
for (int j = 0; j < sizeof(b); ++j)
{
smallnum = smallnum < a[i]*b[j] ? smallnum : a[i]*b[j];
}
}

return smallnum;
}

void main()
{
int a[] = {1, 3, 5, 7};
int b[] = {2, 4, 6, 8};

int c = big(a ,b);
printf("%d",c);
}
bdmh 2011-07-16
  • 打赏
  • 举报
回复
你这就是个循环组合,代码肯定有问题
shuaiwang_01 2011-07-16
  • 打赏
  • 举报
回复
希望大家来讨论讨论。
Freedom 2011-07-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 c_losed 的回复:]
C/C++ code


#include <stdio.h>

int big(int a[], int b[])
{
int smallnum = a[0] * b[0];

for (int i = 0; i < sizeof(a); ++i)
{
for (int j = 0; j < sizeof(b); ++j)
……
[/Quote]
++1
sfs198754583 2011-07-16
  • 打赏
  • 举报
回复
不错,收藏了!
shuaiwang_01 2011-07-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wesweeky 的回复:]

lz上代码
[/Quote]
#include <iostream>
using namespace std;

int* get_multiply_value(const int *a, const int *b, const int alen, const int blen, const int n)
{
int* result = new int[n];

bool** flag = new bool*[alen];
for (int i = 0; i < blen; i++)
{
flag[i] = new bool[blen];
}

for (int i = 0; i < alen; i++)
for (int j = 0; j < blen; j++)
flag[i][j] = false;

int i = 0;//point to the first element in a[]
int j = 0;//point to the first element in b[]
int count = 0;
while (count < n)
{
result[count++] = a[i] * b[j];
flag[i][j] = true;

if (i == alen - 1 && j == blen - 1)
{
for (int p = count; p < n; p++)
result[p] = 0;
break;
}
if (i == alen - 1)
{
j++;
for (int p = 0; p < i; p++)
{
result[count++] = a[p] * b[j];
flag[p][j] = true;
}
}
else if (j == blen - 1)
{
i++;
for (int p = 0; p < j; p++)
{
result[count++] = a[i] * b[p];
flag[i][p] = true;
}
}
else if (a[i + 1]*b[j] < a[i]*b[j + 1])
{
for (int q = 0; q < i; q++)
{
if (b[j + 1]*a[q] < a[i + 1]*b[j])
{
if (!flag[q][j + 1])
{
result[count++] = b[j + 1]*a[q];
flag[q][j + 1] = true;
}
}
else
{
break;
}
}

i++;

for (int p = 0; p < j; p++)
{
result[count++] = a[i] * b[p];
}
}
else
{
for (int q = 0; q < j; q++)
{

if (a[i + 1]*b[q] < b[j + 1]*a[i])
{
if (!flag[i + 1][q])
{
result[count++] = a[i + 1]*b[q];
flag[i + 1][q] = true;
}
}
else
{
break;
}
}

j++;

for (int p = 0; p < i; p++)
{
result[count++] = a[p] * b[j];
}
}
}
return result;
}
int main()
{
//前n个最小值
const int n = 8;

int b[] = {2,4,6,8};
int a[] = {1,3,5,7};

int *result = get_multiply_value(a, b, sizeof(a)/sizeof(a[0]), sizeof(b)/sizeof(b[0]), n);

for (int i = 0; i < n; i++)
{
printf("%d\n", result[i]);
}
return 0;
}

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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