基于partition函数解答某些编程题的思想

SQL实战:04之SQL中的分组问题求解 最近刷题时遇到一些比较有意思的题目,乍一遇上时还不知道怎么求解,在灵光一闪时找到了问题的求解答案,感觉还比较有意思。题目虽然不是很难,但是要解答出来还是需要有一点思维的转弯,为了加深记忆,就选取了一道记录下来。这道题考察的知识点就是对窗口的理解和运用,第一步下移并做差值运算一般都可以快速想到,第二步就需要一点点思维的闪光。利用IF做归一话处理并使用滑动窗口求和得到分组的组号。 阅读详情

       快速排序的核心就是partition函数,我们可以对该函数的接口作适当的改变,来运用修改过的partion函数解决一些编程算法。

       这里举两个例子,这两个例子所用的partition函数如下所示:

int randomRange(int start,int end)
{
	return rand()%(end-start+1)+start;
}
int Partition(int input[],int length, int start,int end)
{
	if (input==NULL||length<=0||(end-start)>(length+1))
		throw new std::bad_exception("Invalid Parameters");
	int keyIndex=randomRange(start,end);
	swap(input[keyIndex],input[start]);
	int key=input[start];
	int p=start;                    
	int q=end+1;
	for (;;)
	{
		do p++;while(p<end&&input[p]<key);
		do q--;while(input[q]>key);	
		if (p<q)
			swap(input[p],input[q]);
		else
			break;
	}
	swap(input[start],input[q]);
	return q;
}

1、 最小的k个数,输入n个整数,找出其中最下的k个数,例如输入4、5、1、6、2、7、3、8、1、2,输出最下的4个数,则输出1、1、2、2。

       这个题目运用partition函数进行求解就是仿照快速排序,不过快速排序分割后对前后两段继续进行分割,而这里需要判定分割的位置,然后再确定对前段还是后段进行分割。代码如下:

void GetLeastNumbers_by_partition(int* input, int n, int* output, int k)
{
    if(input == NULL || output == NULL || k > n || n <= 0 || k <= 0)
        return;
	
    int start = 0;
    int end = n - 1;
    int index = Partition(input, n, start, end);
    while(index != k - 1)
    {
        if(index > k - 1)
        {
            end = index - 1;
            index = Partition(input, n, start, end);
        }
        else
        {
            start = index + 1;
            index = Partition(input, n, start, end);
        }
    }
	
    for(int i = 0; i < k; ++i)
        output[i] = input[i];
}

1、 数组中出现超过一半的数字,这一题就是《编程之美》上面寻找发帖水王的那题。

       选择合适的判定条件进行递归,就可以求出结果,代码如下:

bool g_bInputInvalid = false;

bool CheckInvalidArray(int* numbers, int length)
{
    g_bInputInvalid = false;
    if(numbers == NULL && length <= 0)
        g_bInputInvalid = true;
	
    return g_bInputInvalid;
}

bool CheckMoreThanHalf(int* numbers, int length, int number)
{
    int times = 0;
    for(int i = 0; i < length; ++i)
    {
        if(numbers[i] == number)
            times++;
    }
	
    bool isMoreThanHalf = true;
    if(times * 2 <= length)
    {
        g_bInputInvalid = true;
        isMoreThanHalf = false;
    }
	
    return isMoreThanHalf;
}
int MoreThanHalfNum_Solution1(int* numbers, int length)
{
    if(CheckInvalidArray(numbers, length))
        return 0;
	
    int middle = length >> 1;
    int start = 0;
    int end = length - 1;
    int index = Partition(numbers, length, start, end);
    while(index != middle)
    {
        if(index > middle)
        {
            end = index - 1;
            index = Partition(numbers, length, start, end);
        }
        else
        {
            start = index + 1;
            index = Partition(numbers, length, start, end);
        }
    }
	
    int result = numbers[middle];
    if(!CheckMoreThanHalf(numbers, length, result))
        result = 0;
	
    return result;
}

        最后给出一个基本的测试函数:

int main()
{

	int a[10]={4,5,1,6,2,7,3,8,1,2};
	int result[4]={0};
	GetLeastNumbers_by_partition(a,10, result, 4);
	for (int i=0;i<4;i++)
		cout << result[i];
	int b[10]={2,1,2,2,6,9,2,1,2,2};
	int num=MoreThanHalfNum_Solution1(b,10);
	cout <<endl<<num<<endl;
	return 0;
}

附录

       关于上述的两个编程题,有更加好的解法,代码如下:

1、

typedef multiset<int, greater<int> >            intSet;
typedef multiset<int, greater<int> >::iterator  setIterator;

void GetLeastNumbers_Solution2(const vector<int>& data, intSet& leastNumbers, int k)
{
    leastNumbers.clear();

    if(k < 1 || data.size() < k)
        return;

    vector<int>::const_iterator iter = data.begin();
    for(; iter != data.end(); ++ iter)
    {
        if((leastNumbers.size()) < k)
            leastNumbers.insert(*iter);

        else
        {
            setIterator iterGreatest = leastNumbers.begin();

            if(*iter < *(leastNumbers.begin()))
            {
                leastNumbers.erase(iterGreatest);
                leastNumbers.insert(*iter);
            }
        }
    }
}

2、

int MoreThanHalfNum_Solution2(int* numbers, int length)
{
    if(CheckInvalidArray(numbers, length))
        return 0;
 
    int result = numbers[0];
    int times = 1;
    for(int i = 1; i < length; ++i)
    {
        if(times == 0)
        {
            result = numbers[i];
            times = 1;
        }
        else if(numbers[i] == result)
            times++;
        else
            times--;
    }
 
    if(!CheckMoreThanHalf(numbers, length, result))
        result = 0;
 
    return result;
}




数据库系统原理核心考点与SQL优化实战 关系型数据库作为数据管理的核心技术,其核心理论包含关系代数与SQL的等价转换、事务ACID特性及并发控制机制。通过锁协议和MVCC实现隔离性,结合两阶段提交保障分布式事务一致性,这些原理直接影响系统在高并发场景下的性能与可靠性。实际工程中需要权衡范式设计与查询效率,例如电商系统常采用反范式减少联表开销。本文通过典型试题解析,深入讲解事务管理(占考试40%分值)、SQL与关系代数互转等高频考点,帮助开发者掌握从I/O代价优化到CAP理论取舍的全链路数据库技能。 阅读详情

相关推荐

C语言中lseek()函数和fseek()函数的使用详解

主要介绍了C语言中lseek()函数和fseek()函数的使用详解,是C语言入门学习中的基础知识,需要的朋友可以参考下

基本算法-partition函数

partition函数为实现快速排序算法的关键函数,其作用是给定一个数组arr[]和数组中任意一个元素a,重排数组使得a左边都小于它,右边都不小于它。 public class Partition { public static int partition(int[] arr,int start,int end,int desIndex){ int des=arr[desIndex

zhouyufei0001的博客 1702

FAST-LIO2实战:如何在无人机上部署并实现厘米级定位(附ROS配置全流程)

本文详细介绍了如何在无人机上部署FAST-LIO2激光雷达惯性里程计系统,以实现厘米级精确定位。内容涵盖从硬件选型(如激光雷达与机载计算机)、软件环境配置(ROS Noetic)、传感器标定,到FAST-LIO2参数调优、与PX4飞控集成以及实际飞行测试的全流程。重点解决了实时定位中的外参标定、数据同步等关键问题,为无人机在无GPS或复杂光照环境下提供稳定可靠的定位解决方案。

weixin_29062865的博客 249

c语言中的中pred函数作用,C++ partition()和stable_partition()函数详解

partition 可直译为“分组”,partition() 函数可根据用户自定义的筛选规则,重新排列指定区域内存储的数据,使其分为 2 组,第一组为符合筛选条件的数据,另一组为不符合筛选条件的数据。举个例子,假设有一个数组 a[9],其存储数据如下:1 2 3 4 5 6 7 8 9在此基础上,如果设定筛选规则为 i%2=0(其中 i 即代指数组 a 中的各个元素),则借助 partition(...

weixin_40004081的博客 3487

电子元器件基础:电阻、电容、电感的特性与应用解析

本文深入解析了电子元器件中电阻、电容和电感三大基础元件的核心特性、工作原理与选型应用。电阻作为电路中的‘交通警察’,控制电流与分配电压,其额定功率与精度是关键选型参数。文章结合实战经验,详细阐述了它们在电源滤波、信号处理及高频电路中的不同表现与避坑指南,是电子设计与维修的必备基础知识。

weixin_29213655的博客 375

DeepSeek高阶应用:DeepSeek+Coze构建智能文献综述与趋势分析自动化系统

本文详细介绍了如何利用DeepSeek与Coze构建智能文献综述与趋势分析自动化系统。通过DeepSeek的深度语义理解和结构化信息提取能力,结合Coze的可视化工作流编排,实现学术论文的自动解析、分类整理与知识入库。该系统能7x24小时自动追踪领域前沿,将研究人员从繁琐的文献处理中解放出来,专注于更高层次的思考与创新。

weixin_29050271的博客 179

Partition函数

快排中核心的方法应该算是Partition函数了,它的作用就是将整个数组分成小于基准值的左边,和大于基准值的右边。 普通的Partition函数是这样的: public static int partition1(int[] array,int lo,int hi){ //以第一个值为基准值,当然你也可以3取1, int key=array[l...

weixin_34095889的博客 1733

数据采集卡架构与PCIe优化设计详解

数据采集卡(DAQ)作为工业自动化中的关键设备,其核心在于模数转换(ADC)和数字信号处理技术。现代系统普遍采用PCIe总线架构,通过DMA传输和时钟同步技术实现高速数据采集。在信号调理环节,可编程增益放大器(PGA)和抗混叠滤波器确保信号质量;而Σ-Δ型ADC则提供高达24位的分辨率。实际应用中,从电力监测到机床振动分析,数据采集卡需要结合具体场景优化配置。通过合理的PCB布局和EMI防护设计,可以有效提升系统在工业环境中的可靠性。

weixin_29168675的博客 909

2024年Linux 错误代码含义 Linux Error Code_linux err code,2024年最新程序员翻身之路

大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

2401_84973144的博客 1178

uniapp - H5网页uni.getLocation报错getLocation:fail Geolocation permission denied.Get ipLocation failed.

uni.getLocation getLocation:fail Geolocation permission denied.Get ipLocation failed.,uni.getLocation定位失败,uni-app getLocation()无法获取定位,一直fail()uniapp移动端h5网页,uniApp微信内置浏览器定位失败,如何解决这个问题,uniapp h5 uni.getLocation获取位置失败怎么办,UNI-APP获取当前位置,uni.getLocation定位失败,unia

🏆 前端领域优质创作者 4241

学习STM32的ADC采集声音

为了采集声音信号,需要一个声音传感器(如麦克风),将声音信号转换为电压信号输入到 ADC 引脚。通过硬件准备、STM32CubeMX 配置和代码实现,我们可以实现将声音信号转换为数字信号,并进行后续处理。STM32 是一款广泛应用于嵌入式系统开发的微控制器平台,其拥有丰富的外设和强大的性能,非常适合进行 ADC(模拟数字转换)的声音采集。函数启动 ADC1 的连续转换模式,然后在一个无限循环中等待 ADC 转换完成,并读取采样结果。四、代码实现 在生成的代码中,会生成一些相关的库文件和示例代码。

m0_75244442的博客 2173

期末考试专项突破:MySQL自定义函数与窗口函数高频考点全解析!

自定义函数是用户根据业务需求编写的可重复调用的 SQL 代码块,必须有返回值,通常用于封装计算逻辑(如字符串处理、数值转换等)。要求:函数名为year_diff,接收两个 DATE 类型参数,返回 INT。解答BEGINEND$$DELIMITER;调用示例-- 返回 25✅ 解析:直接使用YEAR()提取年份相减,简单高效。注意不要用DATEDIFF再除以 365,那样不准确。

吾为热爱计科,致力于知识分享的践行者,此博客是我在这条道路上留下的足迹。 193

【气候模式降尺度】分位数增量映射(QDM)原理及MATLAB代码实现

简介QDM原理及其MATLAB代码实现

WW、forever的博客 5860

校招算法笔面试 | SQL笔试面试编程题-每个部门薪资排名前两名员工

牛客题库题解

wc529065的博客 478

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之EcuM模块配置详解(上)

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之EcuM模块配置详解(上)

weixin_42412049的博客 1015

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

校招算法笔面试 | SQL笔试面试编程题-每个顾客最近一次下单的订单信息

牛客题库题解

wc529065的博客 486

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

[LeetCode] Partition Equal Subset Sum划分数组形成两个和相等的子集

声明:原题目转载自LeetCode,解答部分为原创 Problem :         Given a non-empty array containing only positive integers, find if the array can be partitioned into two subsets such that the sum of elements i

xblog_的博客 3532

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

校招算法笔面试 | SQL笔试面试编程题-牛客每个人最近的登录日期(二)

牛客题库题解

wc529065的博客 869

SQL实战50题:附完整代码和答案,面试必备!

SQL实战50题是面向数据库学习和面试准备的经典练习集,涵盖基础查询、多表连接、聚合函数、窗口函数等场景。以下是部分代表性题目及解答,完整题目可通过在线资源获取。

fqqdzqko61488b的博客 593

每天一道大厂SQL题【Day19】华泰证券真题实战(一)_sql编程题存在一张券商每日的功能号调用情况表,每一条记录反应了(1)

如果你想使用窗口函数来查询出每门课都大于80分的学生姓名,你可以使用MIN函数作为窗口函数。首先,你可以使用PARTITION BY子句来按照学生姓名对数据进行分组,然后使用MIN函数来计算每个学生的最低分数。首先,你可以按照学生姓名对数据进行分组,然后使用MIN函数来计算每个学生的最低分数。头等舱可以优先登机,银行VIP可以不用排队,演唱会最贵的票位置最好,世界从不平等,你有多努力,就有多特殊!,作为一名资深大数据选手,深知SQL重要性,接下来我准备用100天时间,基于大数据岗面试中的。

2401_84185182的博客 851

每天一道大厂SQL题【Day19】华泰证券真题实战(一)_sql编程题存在一张券商每日的功能号调用情况表,每一条记录反应了(2)

如果你想使用窗口函数来查询出每门课都大于80分的学生姓名,你可以使用MIN函数作为窗口函数。首先,你可以使用PARTITION BY子句来按照学生姓名对数据进行分组,然后使用MIN函数来计算每个学生的最低分数。首先,你可以按照学生姓名对数据进行分组,然后使用MIN函数来计算每个学生的最低分数。头等舱可以优先登机,银行VIP可以不用排队,演唱会最贵的票位置最好,世界从不平等,你有多努力,就有多特殊!,作为一名资深大数据选手,深知SQL重要性,接下来我准备用100天时间,基于大数据岗面试中的。

2401_84185182的博客 470

每天一道大厂SQL题【Day19】华泰证券真题实战(一)

大家好,我是Maynor。相信大家和我一样,都有一个大厂梦,作为一名资深大数据选手,深知SQL重要性,接下来我准备用100天时间,基于大数据岗面试中的经典SQL题,以每日1题的形式,带你过一遍热门SQL题并给出恰如其分的解答。一路走来,随着问题加深,发现不会的也愈来愈多。但底气着实足了不少,相信不少朋友和我一样,日积月累才是最有效的学习方式!

Maynor的博客 1579

新疆大学828数据结构考研全攻略:从基础到复试的深度解析与规划

数据结构是计算机科学的核心基础,它研究数据的组织、存储和操作方式,其核心原理在于通过逻辑结构(如线性表、树、图)和物理结构(如顺序存储、链式存储)的高效结合来解决实际问题。掌握数据结构的技术价值在于能够显著提升算法效率与程序性能,是构建复杂软件系统和进行高性能计算的基石,广泛应用于搜索引擎、数据库管理、操作系统和人工智能等领域。对于报考新疆大学计算机技术(085404)与计算机科学与技术(081200)专业的考生而言,深入理解并熟练应用数据结构中的**递归/分治算法**与**迭代/贪心算法**等核心思想,是

weixin_34015336的博客 358

【算法】大厂机考总结和HOT100

【最新最全】华为OD历年机试题集合+OJ刷题网址+刷题经验_华为的外包都要提前刷题 数据库刷题的地址是哪个-优快云博客。

qq_58358642的博客 378

partition函数

前提:需要有一个用来进行对比的基准 partition函数是将一个数组分成三部分: 左部分:是 中部分:是==基准 右部分:是>基准 left:左部分的右边界 index:中部分右边界的右边 right:右部分的左边界 遍历过程中,左部分和中部分一直是重合的,中部分和右部分的边界在努力的靠近并准备合并。 详细: 当arr[index] 当arr[ind

metheir的博客 4580
上一篇: 关于链表算法题的双指针
下一篇: 数值型别的极值
sicofield
博客等级 码龄18年 169粉丝 169原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值