温故知新,基础复习(一个有序从大到小不重复的数列,任意给出一个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);
}



目录
相关文章
|
9天前
|
算法 JavaScript 测试技术
【数学】【组合数学】1830. 使字符串有序的最少操作次数
【数学】【组合数学】1830. 使字符串有序的最少操作次数
|
3月前
|
存储 C语言
牛客网刷题总结(1.有序序列判断,2.获得月份天数,3.矩阵相等判定,4.矩阵转换,5.井字棋判断输赢,6.递归进行进制转化)
牛客网刷题总结(1.有序序列判断,2.获得月份天数,3.矩阵相等判定,4.矩阵转换,5.井字棋判断输赢,6.递归进行进制转化)
39 0
|
6月前
【Leetcode -643.子数组最大平均值Ⅰ -645.错误的集合】
【Leetcode -643.子数组最大平均值Ⅰ -645.错误的集合】
29 0
|
6月前
|
人工智能 BI 索引
【Leetcode -598.范围求和Ⅱ -599.两个列表的最小索引总和】
【Leetcode -598.范围求和Ⅱ -599.两个列表的最小索引总和】
24 0
|
2月前
|
算法 测试技术 C++
【数论】【分类讨论】【C++算法】1611使整数变为 0 的最少操作次数
【数论】【分类讨论】【C++算法】1611使整数变为 0 的最少操作次数
|
3月前
|
算法 测试技术 C#
【数学】LeetCode1526: 形成目标数组的子数组最少增加次数
【数学】LeetCode1526: 形成目标数组的子数组最少增加次数
|
3月前
|
算法 测试技术 C#
【map】【动态规划】LeetCode2713:矩阵中严格递增的单元格数
【map】【动态规划】LeetCode2713:矩阵中严格递增的单元格数
|
3月前
|
机器学习/深度学习 存储 算法
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
34 0
|
5月前
|
C语言
【C语言刷题】调整奇数偶数顺序、有序序列合并以及有序序列判断
【C语言刷题】调整奇数偶数顺序、有序序列合并以及有序序列判断
36 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的奇数+二分法)
75 0
复习C部分:1.for循环 2.do while循环语句 3.在一个有序数组中查找某个数,例如在1~10之间找7(例题包含计算n的阶乘+打印1~10的奇数+二分法)