279-寻找最小差值的问题

寻找最接近的点

在这里插入图片描述

寻找最小差值的问题

假设我们有一个数组,数组中的数据并没有进行排序,通过找第k位小的,会给出一个m值,把数据进行划分,并没有排序,m的位置不动,s1<=m,s2>m
在这里插入图片描述
我们在m的左边找一个d1,右边找一个d2,然后在左边找到最大值,在右边找到最小值,相减得到d3。
为什么在s1找最大值,s2找最小值?
我们在划分的时候,找的是第k小的数据,有一个数据是m,s1的所有值均小于等于m,s2的所有值均大于m,在s1找最大值,在s2找最小值,相减值(差值)就是最小的!

寻找最小差值的代码

#include<iostream>
#include<limits.h>
using namespace std;

//#define INT_MAX   2147483647
int Parition(vector<int>& br, int left, int right)//划分函数 
{
	int i = left, j = right;
	int tmp = br[i];
	while (i < j)
	{
		while (i < j && br[j] > tmp) --j;
		if (i < j) br[i] = br[j];
		while (i < j && br[i] <= tmp) ++i;
		if (i < j) br[j] = br[i];
	}
	br[i] = tmp;
	return i;
}

int Select_K(vector<int>& br, int left, int right, int k)//寻找第k位小的数据 
{
	if (left == right && k == 1) return br[left];
	int index = Parition(br, left, right);
	int pos = (index - left + 1);
	if (k <= pos) return Select_K(br, left, index, k);
	else return Select_K(br, index + 1, right, k - pos);
} 

int Min_Int(int a, int b)
{
	return a < b ? a : b;
}
int Min3(int a, int b, int c)
{
	return Min_Int(a, Min_Int(b, c));
}
int MaxS1(vector<int>& br, int left, int right)
{
	return br[right];
}
int MinS2(vector<int>& br, int left, int right)
{
	int min = br[left];
	for (int i = left + 1; i <= right; ++i)
	{
		if (min > br[i])
		{
			min = br[i];
		}
	}
	return min;
}
int Cpair(vector<int>& br, int left, int right)//寻找最小差值的函数 
{
	if (right - left < 1) return INT_MAX; //只有1个数据,返回初始化的最大值 
	int k = (right - left + 1) / 2;//寻找中的下标 

	Select_K(br, left, right, k);//调动,寻找第k小的数据值,进行划分 
	int d1 = Cpair(br, left, left + k -1); // s1区域 
	int d2 = Cpair(br, left + k, right); // s2区域 

	int p = MaxS1(br, left,left + k - 1); // s1的最大值 
	int q = MinS2(br, left + k, right);// s2的最小值 

	return Min3(d1, d2, q - p);//返回最小差值 
}
int main()
{
	vector<int> ar = { 14,56,34,100,23,78,93,12,45,67,88 };
	
	int dist = Cpair(ar, 0, ar.size() - 1);

	cout << dist << endl;
	return 0;
}

运行程序

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林林林ZEYU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值