ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

414. 第三大的数

2021-10-08 19:31:56  阅读:145  来源: 互联网

标签:right nums int 第三 414 include left more


这道题很简单,但是有好几个人问过我了,我一直答得都不好。
首先partition,期望来进行分割,但其实用bfprt的话可以常数分割。
主函数那几个分割一定要助理,麻烦的话也不麻烦,但是很容易漏下,比如while的条件,kth的判断等等

#include<iostream>
#include<vector>
#include<unordered_set>
#include<algorithm>
using namespace std;
void partition(vector<int>& a, int left, int& less, int& more, int right)
{
	if(left>right)
		return;
	int index=right, erg = left;
	more = right, less = left-1;
	while(erg<more)
	{
		if(a[erg]<a[index])
			swap(a[++less], a[erg++]);
		else if(a[erg]>a[index])
			swap(a[--more], a[erg]);
		else
			++erg;
	}
	swap(a[more++], a[index]);
	return;
}

void dupRemove(vector<int>&a)
{
	unordered_set<int>b;
	for(int i=0; i<(int)a.size();)
	{
		if(b.end()==b.find(a[i]))
			b.insert(a[i++]);
		else
			a.erase(a.begin()+i);
	}
}

int thirdMax(vector<int>& nums) {

	dupRemove(nums);
	int n=(int)nums.size(), kth=n-3;
	int less=-1, more=n-1;
	int left=0, right=n-1;

	if(n<3 && n>0)
		return *max_element(nums.begin(), nums.end());
	while(left<right)
	{
		partition(nums, left, less, more, right);
		if(kth>=more)
			left=more;
		else if(kth<=less)
			right=less;
		else
			return nums[less+1];
	}
	return nums[left];
}
int main(void)
{
	vector<int>a={2,2,1};
	cout<<thirdMax(a)<<endl;
	return 0;
}

标签:right,nums,int,第三,414,include,left,more
来源: https://blog.csdn.net/qigezuishuaide/article/details/120658150

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有