(每周10题)之 leetcode题目 ---(11~13)

     这周抽了点时间写了这3道题,其实发现,中等题目与简单题目,都是相对比较简单的。有些中等的也还好,现在还是感觉困难的比较有意思,哈哈。

 第十一题:盛最多水的容器

 解题思路:

  从最开始看到题目,其实就如同找到最大值一样,面积不就是底×高,高为min(x,y).t为两个下标距离
 从传统遍历的话,设置I,j,这样的话时间复杂度为O(n^2).但是找到最大值的例子可是O(n),
 于是便想t在最大的时候是确定的,数组确定下来后。不妨左右开始记录下标,向中间进攻。

 于是这就是双指针法,专门用来确定边界的一些问题。 
  当 x <= y  ,我们移动y 为y1: 由min(x,y) == x; t移动一下,为t1 < t;
  当 y1 <= y,  min(x, y1) <= min(x, y)
  当 y1 > y   min(x,y1) == x == min(x,y)
  面积 s = min(x,y1)*t1  <= min(x,y)*t1 < min(x,y)*t;  
  所以移动大的数据,得到的结果比开始的小,所以不能移动大的,

  当移动小的,x <= y  我们移动小的x 为x1,由min(x,y) == x  t移动一下,为t1 < t;
  当 x1 <= x   min(x1, y) <= min(x, y)  结果当然比这个小了,
  只有 x1 > x的时候 面积才不缺定,才有可能比较大,这个不就是记录最大值问题,

  遍历下来也就是线性的 O(n);

int maxArea(vector<int>& height) {
	int l = 0, r = height.size() - 1;
	int ans = 0;
	while (l < r) {
		int area = min(height[l], height[r]) * (r - l);
		ans = max(ans, area);
		if (height[l] <= height[r]) {
			++l;
		}
		else {
			--r;
		}
	}
	return ans;
}

void testmaxArea()
{
	vector<int> height = {1,8,6,2,5,4,8,3,7};

	int data = maxArea(height);

	cout << "the height is " << data << endl;
}

输出结果:

the height is 49

第十二题:整数转罗马数字

解题思路:

当出现这样的情况的时候,就单独这样的题目,一个转化成另一个的时候,可以想到hashmap
规定后,做除法,匹配对应的字母,就可以了,时间复杂度O(1)
也是贪心算法,采用最大方式来表示。

string intToRoman(int num) {
	int values[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
	string reps[] = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };

	string res;
	for (int i = 0; i < 13; i++)  //这里不使用图里的count了,一遍一遍来就行了
		while (num >= values[i])
		{
			num -= values[i];
			res += reps[i];
		}
	return res;
}

 第十三题:罗马数字转整数

上个题目是相互转换,采用打表方式,也就是hashmap,典型的费空间省时间。题目比较简单 主要考虑的是
通过观察我们发现,只有在遇到特殊情况时,两个字符中左边的字符小于右边的字符,
且等于右边的字符代表的数减左边字符代表的数。 比如 CM 等于 1000 - 100,XC 等于 100 - 10;

int romanToInt(string s) {
	int result = 0;
	map<char, int> luomab = {
		{ 'I',1 },
		{ 'V',5 },
		{ 'X',10 },
		{ 'L',50 },
		{ 'C',100 },
		{ 'D', 500 },
		{ 'M', 1000 }
	};//初始化哈希表
	for (int i = 0; i < s.length(); i++)
	{
		if (luomab[s[i]] < luomab[s[i + 1]])
			result -= luomab[s[i]];
		else
		{
			result += luomab[s[i]];
		}
	}
	return result;
}

void testromanToInt()
{
	string s = "MCMXCIV";
	
	int data = romanToInt(s);

	cout << s <<" is "<< data << endl;

}

输出结果:

结果:
MCMXCIV is 1994

 

题目相对比较简单吧,要注意点细节,能解决问题才是本能。周一没有写成,慢慢来吧,争取学习到更多的东西。每天都有进步的感觉十分充实。一起加油。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值