编程算法 - 和为s的两个数字 代码(C)

和为s的两个数字 代码(C)

本文地址: http://blog.csdn.net/caroline_wendy

题目: 输入一个递增排序的数组和一个数字s, 在数组中查找两个数, 使得它们的和正好是s.

假设有多对数字的和等于s, 输出随意一对就可以.

排序数组, 则能够从两端(即最大值, 最小值)開始进行查找, 当和大于时, 则降低前端, 当和小于时, 则递增尾端.

时间复杂度O(n).

代码:

/*
 * main.cpp
 *
 *  Created on: 2014.6.12
 *      Author: Spike
 */

/*eclipse cdt, gcc 4.8.1*/

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

bool FindNumbersWithSum(int data[], int length, int sum, int* num1, int* num2)
{
	bool found = false;
	if (length<1 || num1==NULL || num2 == NULL)
		return found;
	int ahead = length-1;
	int behind = 0;

	while (ahead > behind) {
		long curSum = data[ahead] + data[behind];
		if (curSum == sum) {
			*num1 = data[behind];
			*num2 = data[ahead];
			found = true;
			break;
		} else if (curSum < sum)
			++behind;
		else
			--ahead;
	}
	return found;
}

int main(void)
{
	int data[] = {1, 2, 4, 7, 11, 15};
	int num1, num2;
	if (!FindNumbersWithSum(data, 6, 15,  &num1, &num2))
		printf("Error\n");
	printf("num1 = %d num2 = %d\n", num1, num2);
}


输出:

num1 = 4 num2 = 11

时间: 2024-07-29 11:52:26

编程算法 - 和为s的两个数字 代码(C)的相关文章

编程算法 - 数组中出现次数超过一半的数字 代码(C)

数组中出现次数超过一半的数字 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 数组中有一个数字出现的次数超过数组长度的一半, 请找出这个数字. 1. 使用高速排序(QuickSort)的方法, 把中值(middle)和索引(index)匹配, 输出中值, 并检測是否符合要求. 2. 使用计数方法依次比較. 代码:  方法1: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */

编程算法 - 和为s的连续正整数序列 代码(C)

和为s的连续正整数序列 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一个正数s, 打印出所有和为s的连续正数序列(至少含有两个数). 起始于1, 2, 相加, 如果相等则返回, 如果小于, 则前端递增右移, 如果大于, 则后端递增右移, 一直到后端移动到s的一半位置. 因为两个数, 小数为一半, 大数为一半加一, 则必然结束. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author:

编程算法 - 萨鲁曼的军队(Saruman&#39;s Army) 代码(C)

萨鲁曼的军队(Saruman's Army) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 直线上有N个点, 每一个点, 其距离为R以内的区域里, 必须带有标记的点, 本身的距离为0. 尽可能少的添加标记点, 至少要有多少点被加上标记? 贪心算法, 从最左边的点开始, 依次查找距离为R需要添加标记的点, 直到结束. 代码: /* * main.cpp * * Created on: 2014.7.17 * Author: spike */

编程算法 - 不能被继承的类(模板参数友元) 代码(C++)

不能被继承的类(模板参数友元) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 用C++设计一个不能被继承的类. 可以使用模板类模板参数友元, 模板类私有构造函数, 类虚继承这个模板类, 如果类被其他类继承时, 则虚继承会直接调用模板类, 无法构造. 代码: /* * main.cpp * * Created on: 2014.7.13 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #inc

编程算法 - n个骰子的点数(非递归) 代码(C)

n个骰子的点数(非递归) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 把n个骰子仍在地上, 所有骰子朝上一面的点数之和为s. 输入n, 打印出s的所有可能的值出现的概率. 每次骰子的循环过程中, 本次等于上一次n-1, n-2, n-3, n-4, n-5, n-6的次数的总和. 代码: /* * main.cpp * * Created on: 2014.7.12 * Author: spike */ #include <stdio.

编程算法 - 将排序数组按绝对值大小排序 代码(C)

将排序数组按绝对值大小排序 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 排序的数组有可能包含正负, 可以使用折半查找确定中值位置, 然后再使用两个指针, 顺次排序两端. 解决思路是: 1.数组中的元素全为正,返回: 2.数组中的元素全为负,返回: 3.数组中有正数有负数,就用二分法查找,判断中间元素的符号 a)中间元素为正,继续判断中间元素前面一个元素的符号; b)中间元素为负,判断中间元素后一个元素的符号; c)中间元素为零,令其等于结果值返

[算法]和为S的两个数字

题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 对应每个测试案例,输出两个数,小的先输出. 思路 定义两个指针,分别从前面和后面进行遍历.间隔越远乘积越小,间隔越近乘积越大,所以最先出现的两个数乘积最小. 代码 import java.util.ArrayList; public class Solution { public ArrayList<Integer> FindNumbersWithSum(

编程算法 - 萨鲁曼的军队(Saruman&amp;#39;s Army) 代码(C)

萨鲁曼的军队(Saruman's Army) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 直线上有N个点, 每个点, 其距离为R以内的区域里, 必须带有标记的点, 本身的距离为0. 尽可能少的加入?标记点, 至少要有多少点被加上标记? 贪心算法, 从最左边的点開始, 依次查找距离为R须要加入?标记的点, 直到结束. 代码: /* * main.cpp * * Created on: 2014.7.17 * Author: spike *

编程算法 - 两个链表的第一个公共结点 代码(C)

两个链表的第一个公共结点 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入两个链表, 找出它们的第一个公共结点. 计算链表的长度, 然后移动较长链表的指针, 使其到相同结点的距离的相同, 再同时移动两个链表的指针, 找到相同元素. 时间复杂度: O(n) 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #i