【LeetCode 004】各种分类讨论

写不出来不肯睡觉系列。。。。。。

#include<stdio.h>
#include<iostream>
#include<vector>
using namespace std;

class Solution {
public:
	int upper(vector<int> a, int l, int r, int key){
		if(a.size() == 0) return -1;
		if (key <= a[l]) {
			while(key == a[l]) l++;
			return l;
		}
		int mid;
		while (l <= r) {
			mid = (l + r) >> 1;
			if (a[mid - 1] <= key && key <=a[mid]) return mid;
			if (a[mid - 1] >= key) {
				r = mid - 1;
			} else {
				l = mid + 1;
			}
		}
		return r + 1;
	}

    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int minL = nums1.size();
		int maxL = nums2.size();
		vector<int> minN;
		vector<int> maxN;
		if (minL <= maxL) {
			minN = nums1;
			maxN = nums2;
		} else {
			minL = nums2.size();
			maxL = nums1.size();
			minN = nums2;
			maxN = nums1;
		}

		int oneDone = -1;
		if (minL == 0) {
			oneDone = 0;
		} else if(maxL == 0){
			oneDone = 1;
		}
		int curL = 0;
		int cen = (minL + maxL) / 2;
		//printf("%d\n", cen);
		int minP = 0;
		int maxP = 0;
		int index;
		int minMax = 0;
		while (curL < cen) {
			if(oneDone != -1) break;
			if(maxP + 1 < maxL && maxN[maxP] == maxN[maxP + 1]) {
				maxP++;
				curL++;
			}
			index = upper(minN, minP, minL - 1, maxN[maxP]);
		//	while(index < minL && maxN[maxP] == minN[index]) index++;
			curL += index - minP;
			minP = index;
			minMax = 0;
			//printf("cen = %d, curL = %d, minP = %d, maxP = %d, index = %d\n", cen, curL, minP, maxP, index);
			if (minP >= minL){
				oneDone = 0;
				break;
			}
			if (curL >= cen) break;

			if(minP + 1 < minL && minN[minP] == minN[minP + 1]) {
				minP++;
				curL++;
			}
			index = upper(maxN, maxP, maxL - 1, minN[minP]);
			//while(index < maxL && minN[minP] == maxN[index]) index++;
			curL += index - maxP;
			maxP = index;
			minMax = 1;
			//printf("cen = %d, curL = %d, minP = %d, maxP = %d, index = %d\n", cen, curL, minP, maxP, index);
			if (maxP >= maxL){
				oneDone = 1;
				break;
			}
			if (curL >= cen) break;
			//int haha;
			//scanf("%d",&haha);
		}
		double ans = 0;
		if (oneDone == 0) {
			if (curL > cen) {
				int indexR = index - (curL - cen);
				if ((minL + maxL) % 2 == 1) {
					ans = minN[indexR];
				} else {
					int indexL = indexR - 1;
					double cenR = minN[indexR];
					double cenL = minN[indexL];
					if (maxN[maxP] > minN[indexL]) {
						cenL = maxN[maxP];
					}
					ans = (cenR + cenL) / 2.0;
				}
			} else {
				int indexR = maxP + cen - curL;
				if ((minL + maxL) % 2 == 1) {
					ans = maxN[indexR];
				} else {
					int indexL = indexR - 1;
					if (indexL >= 0) {
						ans = (maxN[indexL] + maxN[indexR]) / 2.0;
					}

					if (minN[minL - 1] > maxN[indexL]) {
						ans = (minN[minL - 1] + maxN[indexR]) / 2.0;
					}
				}
			}
		} else if (oneDone == 1) {
			if (curL > cen) {
				int indexR = index - (curL - cen);
				if ((minL + maxL) % 2 == 1) {
					ans = maxN[indexR];
				} else {
					int indexL = indexR - 1;
					double cenR = maxN[indexR];
					double cenL = maxN[indexL];
					if (minN[minP] > maxN[indexL]) {
						cenL = minN[minP];
					}
					//printf("%f %f\n", cenR, cenL);
					ans = (cenR + cenL) / 2.0;
				}
			} else {
				int indexR = minP + cen - curL;
				if ((minL + maxL) % 2 == 1) {
					ans = minN[indexR];
				} else {
					int indexL = indexR - 1;
					if (indexL >= 0) {
						ans = (minN[indexL] + minN[indexR]) / 2.0;
					}
					if(maxN[maxL - 1] > minN[indexL]){
						ans = (maxN[indexL] + minN[indexR]) / 2.0;
					}
				}
			}
		} else {
			if (curL == cen) {
				if (minMax == 0) {//
					if ((minL + maxL) % 2 == 1) {
						ans = maxN[maxP];
					} else {
						double cenR = maxN[maxP];
						double cenL = minN[index - 1];
						if(maxP >= 0 && maxN[maxP - 1] > cenL) {
							cenL = maxN[maxP - 1];
						}
						ans = (cenR + cenL) / 2.0;
					}
				} else {//
					if ((minL + maxL) % 2 == 1) {
						ans = minN[minP];
					} else {
						double cenR = minN[minP];
						double cenL = maxN[index - 1];
						if(minP >= 0 && minN[minP - 1] > cenL) {
							cenL = minN[minP - 1];
						}
						ans = (cenR + cenL) / 2.0;
					}
				}
			} else {
				int indexR = index - (curL - cen);
				if (minMax == 0) {
					if ((minL + maxL) % 2 == 1) {
						ans = minN[indexR];
					} else {
						double cenR = minN[indexR];
						double cenL = minN[indexR - 1];
						if (maxN[maxP] > minN[indexR - 1]) {
							cenL = maxN[maxP];
						}
						ans = (cenR + cenL) / 2.0;
					}
				} else {
					if ((minL + maxL) % 2 == 1) {
						ans = maxN[indexR];
					} else {
						double cenR = maxN[indexR];
						double cenL = maxN[indexR - 1];
						if (minN[minP] > maxN[indexR - 1]) {
							cenL = maxN[maxP];
						}
						ans = (cenR + cenL) / 2.0;
					}
				}
			}
		}
		return ans;
    }
};

int main() {
	vector<int> num1;
	num1.push_back(2);
	//num1.push_back(2);
//	num1.push_back(3);

	vector<int> num2;
	num2.push_back(1);
	num2.push_back(3);
	num2.push_back(4);
//	num2.push_back(10);
//	num2.push_back(11);
//	num2.push_back(13);
//	num2.push_back(15);
//	num2.push_back(21);
//	num2.push_back(22);
//	num2.push_back(23);
//	num2.push_back(24);
//	num2.push_back(25);
//	num2.push_back(26);
//	

	Solution s;
	double ans = s.findMedianSortedArrays(num1, num2);
	cout << ans << endl;
	//cout << s.upper(num1, 0, 3, 4) << endl;
	return 0;
}
时间: 2024-10-07 05:27:02

【LeetCode 004】各种分类讨论的相关文章

(分类讨论, 情景模拟) lintcode 640. One Edit Distance, leetcode 388,intcode 645. 13. 12. 659. 660

找特殊情况,分类讨论:三种情况 1)两个字符串的长度之差 大于1 直接返回false: 2)长度之差等于1, 判断长的字符串删掉不一样的字符,剩余的字符串是否相同: 3)长度之差等于0,判断不相同的字符个数,若超过一个返回false. class Solution { public: /** * @param s: a string * @param t: a string * @return: true if they are both one edit distance apart or f

【线段树】【分类讨论】水果姐逛水果街Ⅰ

3304 水果姐逛水果街Ⅰ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. 学过oi的水果姐迅速发现了一个赚钱的方法:在某家水果店买一个水果,再到另外一家店卖出去,赚差价. 就在水果姐窃喜的时候,cgh突然出现,他为了为难水果姐,给出m个问题,每个问题要求水果姐从第x家店出发到第y家店

dp+分类讨论 Gym 101128E

题目链接:http://codeforces.com/gym/101128 感觉这个人写的不错的(我只看了题目大意):http://blog.csdn.net/v5zsq/article/details/61428924 Description n个小木条,一段前面有一个小箭头,给出第一个小木条的非箭头端端点横坐标以及每个小木条箭头端的坐标,现在要从下往上把这n'个木条按顺序叠放好,要求相邻两个小木条必须有一个共同端点且有交叠部分,问小木条有多少种放法 Input 第一行一整数n表示木条数量,之

BZOJ 1067 降雨量(RMQ+有毒的分类讨论)

1067: [SCOI2007]降雨量 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 4399  Solved: 1182 [Submit][Status][Discuss] Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意 Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,2004和2005年的降雨量分别为4920,5901,2832和3890, 则可以说

[LeetCode] 004. Median of Two Sorted Arrays (Hard) (C++/Java/Python)

索引:[LeetCode] Leetcode 题解索引 (C++/Java/Python/Sql) Github: https://github.com/illuz/leetcode 004.Median_of_Two_Sorted_Arrays (Hard) 链接: 题目:https://oj.leetcode.com/problems/Median-of-Two-Sorted-Arrays/ 代码(github):https://github.com/illuz/leetcode 题意: 求

cf 251 B Playing with Permutations 暴力 分类讨论

题链;http://codeforces.com/problemset/problem/251/B B. Playing with Permutations time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Little Petya likes permutations a lot. Recently his mom has p

BZOJ 1099([POI2007]树Drz-9次线段树&amp;分类讨论+线段树与插入顺序维护2个参数)

1099: [POI2007]树Drz Time Limit: 15 Sec  Memory Limit: 162 MB Submit: 142  Solved: 55 [Submit][Status] Description CDQZ是一个偏远的小学校,FGD在学校里中了一排树.他却不喜欢这些树的顺序,因为他们高高矮矮显得那么参差不齐. FGD定义这些树的不整齐程度为相邻两树的高度差的和.设树高分别为h1,h2,h3,-,hn.那么不整齐程度定义为:|h1-h2|+|h2-h3|+--+|hn

POJ 2826 An Easy Problem?!(线段相交,分类讨论)

题意:给两个线段,问他们能收集到多少雨水. 链接:http://poj.org/problem?id=2826 解法:分四种情况讨论 1. 存在一个线段与x轴平行,答案为0 2. 两个线段没有交点,答案为0 3. 1和2都不满足时,令线段1为比较低的那个线段,且p1为其比较高的那个点,若该点往y轴正方向的射线与线段2有交点,则答案为0 4. 3不满足时,求出两线段交点x1,p1做一条平行于x轴的线,该线与线段2的交点x2,则三角形x1, x2, p1的面积就是答案 小结:此题属于分类讨论型的题,

Codeforces 460D Little Victor and Set --分类讨论+构造

题意:从区间[L,R]中选取不多于k个数,使这些数异或和尽量小,输出最小异或和以及选取的那些数. 解法:分类讨论. 设选取k个数. 1. k=4的时候如果区间长度>=4且L是偶数,那么可以构造四个数(L,L+1,L+2,L+3),这样的话(L^(L+1)) ^ ((L+2)^(L+3)) = 0,最优 如果L不是偶数,那么看从L+1到R有没有四个数,如果有则取该四个数,否则最小异或和达不到0,也达不到1了,不再考虑k=4,k=3时还有可能等于0,所以转到k=3 2. k=3时,要使异或和为0,那

【树链剖分】【dfs序】【LCA】【分类讨论】Codeforces Round #425 (Div. 2) D. Misha, Grisha and Underground

一棵树,q次询问,每次给你三个点a b c,让你把它们选做s f t,问你把s到f +1后,询问f到t的和,然后可能的最大值是多少. 最无脑的想法是链剖线段树--但是会TLE. LCT一样无脑,但是少一个log,可以过. 正解是分类讨论, 如果t不在lca(s,f)的子树内,答案是dis(lca(s,f),f). 如果t在lca(s,f)的子树内,并且dep(lca(s,t))>dep(lca(f,t)),答案是dis(lca(s,t),f): 否则答案是dis(lca(f,t),f). #in