LeetCode 75&88&215

75 颜色分类 


    给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序
    使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
    输入: [2,0,2,1,1,0]
    输出: [0,0,1,1,2,2]

思路:利用三路快排的思想

class Solution {
public:
    void sortColors(vector<int>& nums) {
        //借鉴三路快排的思想
		//[0,lt]都为0 [lt+1,gt-1]都为1  [gt,n)都为2
		int lt=-1,gt=nums.size();
		for(int i=0; i<gt;)
		{
			if(nums[i]==0)
			{
				lt++;
				swap(nums[i],nums[lt]);	
				i++;	
			}else if(nums[i]==2)
			{
				gt--;
				swap(nums[i],nums[gt]);	
			}else{
				i++;
			}
		} 
    }
};

88 合并两个有序数组 


    给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 num1 成为一个有序数组。
    输入:
    nums1 = [1,2,3], m = 3
    nums2 = [2,5,6],n = 3
    输出:[1,2,2,3,5,6]

思路:归并排序的归并过程

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
    	int arr[m+n];
    	int k=0,i=0,j=0;
    	while(i<m && j<n)
    	{
    		//比较两个数组,将比较小的那个数,放到结果中 
    		if(nums1[i]<=nums2[j])
			{
				arr[k] = nums1[i];
				i++;
			}else
			{
				arr[k]=nums2[j];
				j++;
			}
			k++;
    	}
		while(i<m)
		{
			arr[k] = nums1[i];
			i++;
			k++;
		}
		while(j<n)
		{
			arr[k]=nums2[j];
			j++;
			k++;
		}
		nums1.resize(0);
		for(int i=0; i<m+n; i++)
			nums1.push_back(arr[i]); 
        
    }
};

215 寻找第k大元素

在未排序的数组中找到第 k 个最大的元素
输入: [3,2,1,5,6,4] 和 k = 2

输出: 5

思想:利用随机化快速排序的partition过程

如果4返回的位置p,那么目标位置>p,就往>p那部分去找,那么对于<p那部分的元素就不需要处理了

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
		//利用双路快排的思想,当前标定点的位置就是正确排序后的位置
		srand(time(NULL));
		if(nums.size()<=1) return nums.size();
		int p=partition(nums,0,nums.size()-1);//[0,p)>v (p,n-1]<v
		int r = nums.size()-k;
		while(true)
		{
			if(r==p)
				return nums[p];
			else if(p>r) //目标在[0,p)
				p=partition(nums,0,p-1); 
			else
				p=partition(nums,p+1,nums.size()-1);	
		}	 
    }
    int partition(vector<int>& nums,int l,int r)
    {
    	swap(nums[l],nums[rand()%(r-l+1)+l]);//随机快排 
    	//在nums[l..r]之间找到nums[l]的正确位置
		int v = nums[l];
		//nums[l+1..j]<v arr[j+1..i]>v
		int j=l;
		for(int i=l+1; i<=r; i++){
			if(nums[i]<v){
				swap(nums[j+1],nums[i]);
				j++;
			}
		}

		swap(nums[l],nums[j]);
		return j; 	 
	} 
};
发布了86 篇原创文章 · 获赞 0 · 访问量 4079

猜你喜欢

转载自blog.csdn.net/qq_31965925/article/details/105234857
今日推荐