如何找到一个数组中的两个数,他们的和为0

本文介绍了一种利用快速排序和双指针法来查找数组中两数之和为零的元素的算法。通过排序数组并使用两个指针从两端向中间移动,实现高效地查找目标和。此方法适用于含有负数的数组,能有效解决和为零的问题。

这个题目我的想法是首先对数组进行排序,应用快速排序。排好顺序之后,设定两个指针,一个指向数组的前端,一个指向数组的末端,然后两个数相加,如果大于0,则后端指针向前移动,如果小于0,则前面指针向后移动。因为这样的数组中肯定会有负数的。如果等于0,则找到两个数,并打印出来。这个解法的时间复杂度为O(nlogn)+O(n).下面给出代码,如果有不正确的地方,希望大家指出。

#include<stdio.h>
int partition(int *a,int low,int high)
{
	int pivotkey=*(a+low);
	while(low<high)
	{
		while(low<high&&*(a+high)>=pivotkey) --high;
		*(a+low)=*(a+high);
		while(low<high&&*(a+low)<=pivotkey)  ++low;
		*(a+high)=*(a+low);
	}
	*(a+low)=pivotkey;
	return low;
}
void q_sort(int *a,int low,int high)
{
	if(low<high)
	{
		int	pivotkey=partition(a,low,high);
		q_sort(a,low,pivotkey);
		q_sort(a,pivotkey+1,high);
	}
}
void find_num(int *a,int n)
{
	int *e=a;
	int *f=a+n-1;
	while(e<f)
	{
		if((*e+*f)<0)
			e++;
		else if((*e+*f)>0)
			f--;
		else if((*e+*f)==0)
			break;
	}
	if(e<f)
		printf("%d+%d=0\n",*e,*f);
	else
		printf("error!\n");
}
void main()
{
	int i;
	int a[]={-7,4,3,-11,6,15,7};
	int n=sizeof(a)/sizeof(int);
	q_sort(a,0,n-1);
	find_num(a,n);
}

在C++中编写程序以找到数组中的中位数最大的位数时,需要考虑几个关键步骤。首先,数组需要被排序以确定中位数,其次需要遍历数组找到最大的位数。 ### 查找中位数 中位数的定义是将一个数据集分成半,其中一半的值小于或等于中位数,另一半大于或等于它。如果数组的大小是奇数,那么中位数就是中间的那个数;如果是偶数,则中位数通常是中间两个数字的平均值。 ### 查找最大位数 要找到数组中的最大位数,需要遍历整个数组,并检查每个数字是否是位数(即介于1099之间)。在此过程中维护一个变量来记录遇到的最大位数值。 下面是一个示例程序,演示了如何实现上述功能: ```cpp #include <iostream> #include <vector> #include <algorithm> double findMedian(std::vector<int>& nums) { std::sort(nums.begin(), nums.end()); int size = nums.size(); if (size % 2 == 0) { return (nums[size / 2 - 1] + nums[size / 2]) / 2.0; } else { return nums[size / 2]; } } int findMaxTwoDigit(const std::vector<int>& nums) { int maxTwoDigit = -1; for (int num : nums) { if (num >= 10 && num <= 99) { if (num > maxTwoDigit) { maxTwoDigit = num; } } } return maxTwoDigit; } int main() { std::vector<int> numbers = {3, 5, 1, 7, 9, 4, 10, 88, 55, 34}; // 示例数组 double median = findMedian(numbers); int maxTwoDigit = findMaxTwoDigit(numbers); std::cout << "The median is: " << median << std::endl; std::cout << "The maximum two-digit number is: " << maxTwoDigit << std::endl; return 0; } ``` 此程序首先对数组进行排序以计算中位数,然后遍历数组找到最大的位数[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值