输入一个有序数组,和一个数k,输出数组中所有三个数的和为k的组合

博文:http://blog.jobbole.com/11745/ 几种常见排序算法的视觉图。可以方便理解各种排序的思想,其中堆排序和希尔排序可能光看图看不明白,建议搜一下。
博文:http://blog.csdn.net/ios_long/article/details/7019718  指针和内存相关。里面有几个很典型的小例子。最近问这事的人挺多的,这帖子里写的比较清楚。

题目1:输入一个有序数组,和一个数k,输出数组中所有三个数的和为k的组合

/*************************************
//注意:这道题就是难题了,如果想做难题建议不要往下看,中等题和简单题的题干会对难题有提示。
//想做中等或想做简单或想看提示的请继续往下看.
*************************************/

题目2:输入一个有序数组,和一个数k,输出数组中所有两个数的和为k的组合,要求在算法的时间复杂度为o(n),(如果不懂,可以简单理解为只用一次循环)

题目3:输入一个有序数组,和一个数k,输出数组中所有两个数的和为k的组合。


p.s. 如果想在查找三个数的函数中调用查找两个数的函数,记录结果是个麻烦事儿,注释掉的代码中会丢解,所以做一半放弃鸟。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

const int LENGTH=100;

void initializeArray(int* array,int len);
int comp(const void *a,const void *b);
void printArray(int* array,int  LENGTH);
//void FindThreeNumbers(int* array,int len,int k);
//int FindTwoNumbers(int* array,int len,int k);
void FindThreeNumbers2(int* array,int len,int k);

int main()
{
    int *array=malloc(sizeof(int)*LENGTH);
    int k,flag=0;
    initializeArray(array, LENGTH);
    printf("the array is:\n");
    printArray(array, LENGTH);
    printf("\n");
	printf("Please enter the k:\n");
	scanf("%d",&k);
	FindThreeNumbers2(array,LENGTH,k);
    return 0;
}

void initializeArray(int* array,int len)
{
    srand(time(NULL));
    int i;
    for(i=0;i<len;i++)
        array[i]=rand()%1000-500;
    qsort(array,LENGTH,sizeof(int),comp);
}

int comp(const void *a,const void *b)
{
	return *(int *)a-*(int *)b;
}

void printArray(int* array,int len)
{
   int i;
	for(i=0;i<=len-1;++i)
	{
		printf("%7d",array[i]);
		if((i+1)%5==0)
			printf("\n");
	}
}


/*void FindThreeNumbers(int* array,int len,int k)
{
 /   int i;
    for(i=2;i<len-1;i++)
    {
        if(FindTwoNumbers(array,i,k-array[i]))
            printf("%7d\n",array[i]);
    }
}
*/

/*int FindTwoNumbers(int* array,int len,int k)
{
    int start=0,end=len-1;
    while(start<end)
    {

        if(array[start]+array[end]<k)
            ++start;
        else if(array[start]+array[end]>k)
            --end;
        else
        {
            printf("Find: %d %d ",array[start],array[end]);
            ++start;
            --end;
            return 1;
        }
    }
    return 0;
}
*/

void FindThreeNumbers2(int* array,int len,int k)
{
    int i;
    for(i=2;i<len-1;i++)
    {
        int start=0,end=i-1;
        while(start<end)
        {

            if(array[start]+array[end]<k-array[i])
                ++start;
            else if(array[start]+array[end]>k-array[i])
                --end;
            else
            {
                printf("Find: %d %d %d\n",array[start],array[end],array[i]);
                ++start;
                --end;
            }
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值