温故知新,基础复习(一个有序从大到小不重复的数列,任意给出一个sum值,求出数列中所有满足和为sum的数对)

简介: 温故知新,基础复习(一个有序从大到小不重复的数列,任意给出一个sum值,求出数列中所有满足和为sum的数对)#include#includevoid PrintSumNumbers(int Arra[],int ASize,int Sum)...

温故知新,基础复习(一个有序从大到小不重复的数列,任意给出一个sum值,求出数列中所有满足和为sum的数对)


#include<stdio.h>
#include<stdlib.h>
void PrintSumNumbers(int Arra[],int ASize,int Sum)
{
	//O(1)
	if (ASize<2)
	{
		printf("The size of the Arra is invalid.\n");
		return;
	}
    if(Sum>=0) {
        if(Arra[ASize-1]>=Sum || Arra[0]<=0) {
        	printf("The minimum value is bigger than the sum or the maximum value is equal or lesser than 0. \n");
        	return;
        }
    }

    if (Sum<0)
    {
    	if (Arra[0]<=Sum || Arra[ASize-1]>=0) {
    		printf("The maximum value is smaller than the sum or the minimum value is equal or greater than 0. \n");
    		return;
    	}
    }

	int LeftIndex=0,RightIndex=ASize-1;
    int MinTempValue = Arra[ASize-1];
    int MaxTempValue = Arra[0];
    if (Sum>=0&&MinTempValue<0)
    {
    	if (MaxTempValue>=0)
    	{
    		MinTempValue = Sum-MaxTempValue;
    		for (int i = ASize-1; i != 0; i--)
    		{
    			if (Arra[i]>=MinTempValue)
    			{
    				RightIndex=i;
    				break;
    			}
    		}
    	}
    }
    else {
    	MaxTempValue = Sum-Arra[ASize-1];
	    for(int i=0;i<RightIndex;i++) {
	    	if(Arra[i]<=MaxTempValue) {
	    		LeftIndex=i;
	    		break;
	    	}
	    }
    }
	

    while( LeftIndex<RightIndex)
    {
    	int TempValue = Arra[LeftIndex]+Arra[RightIndex];
    	if(TempValue==Sum) {
    		printf("(%d) + (%d) = (%d)\n",Arra[LeftIndex],Arra[RightIndex],Sum );
    		LeftIndex++;
    		RightIndex--;
    	}
    	else if (TempValue>Sum)
    	{
    		LeftIndex++;
    	}
    	else {
    		RightIndex--;
    	}
    }
}

int main()
{
    int Arra[] = {2147483647,2147483646,9,8,7,6,5,4,3,2,1,0,-1,-2,-3,-2147483646,-2147483647,-2147483647-1};
    PrintSumNumbers(Arra,sizeof(Arra)/sizeof(Arra[0]),2147483647);
}



目录
相关文章
|
7月前
|
算法 测试技术 C++
【动态规划】【前缀和】【数学】2338. 统计理想数组的数目
【动态规划】【前缀和】【数学】2338. 统计理想数组的数目
【Leetcode -643.子数组最大平均值Ⅰ -645.错误的集合】
【Leetcode -643.子数组最大平均值Ⅰ -645.错误的集合】
55 0
|
7月前
|
存储 算法
算法题解-组合总和3
算法题解-组合总和3
|
7月前
|
算法 测试技术 C#
【数学】LeetCode1526: 形成目标数组的子数组最少增加次数
【数学】LeetCode1526: 形成目标数组的子数组最少增加次数
|
7月前
|
算法 测试技术 C#
【map】【动态规划】LeetCode2713:矩阵中严格递增的单元格数
【map】【动态规划】LeetCode2713:矩阵中严格递增的单元格数
|
7月前
|
机器学习/深度学习 存储 算法
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
101 0
|
C语言
【C语言刷题】调整奇数偶数顺序、有序序列合并以及有序序列判断
【C语言刷题】调整奇数偶数顺序、有序序列合并以及有序序列判断
69 0
复习C部分:1.for循环 2.do while循环语句 3.在一个有序数组中查找某个数,例如在1~10之间找7(例题包含计算n的阶乘+打印1~10的奇数+二分法)
复习C部分:1.for循环 2.do while循环语句 3.在一个有序数组中查找某个数,例如在1~10之间找7(例题包含计算n的阶乘+打印1~10的奇数+二分法)
120 0
复习C部分:1.for循环 2.do while循环语句 3.在一个有序数组中查找某个数,例如在1~10之间找7(例题包含计算n的阶乘+打印1~10的奇数+二分法)
复习C部分:1.看代码求值题 2.写三个整数代码从大到小输出 3.打印1~100中所有3的倍数 4.给定两个数,求最大公约数(递减法,辗转相除法)
复习C部分:1.看代码求值题 2.写三个整数代码从大到小输出 3.打印1~100中所有3的倍数 4.给定两个数,求最大公约数(递减法,辗转相除法)
159 0
复习C部分:1.看代码求值题 2.写三个整数代码从大到小输出 3.打印1~100中所有3的倍数 4.给定两个数,求最大公约数(递减法,辗转相除法)
|
存储 人工智能 图计算
双指针(使用题目:求子数组(可能是连续的或者是数组中某两个或某三个之和(积等等)等于某个值)特点分析【切记每道题目的分析都要切合题意】
双指针(使用题目:求子数组(可能是连续的或者是数组中某两个或某三个之和(积等等)等于某个值)特点分析【切记每道题目的分析都要切合题意】
261 0
双指针(使用题目:求子数组(可能是连续的或者是数组中某两个或某三个之和(积等等)等于某个值)特点分析【切记每道题目的分析都要切合题意】