力扣刷题第六天

11. 盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/container-with-most-water
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:
  首先想到的是遍历数组,逐一进行计算获取最大值。时间复杂度 O ( n ! ) O(n!) O(n!),时间超限。

官方给出双指针的解法,理解之后进行了使用。
双指针证明:
  设 x x x为指向容器左边的指针, y y y为指向容器右边的指针, t t t x x x y y y之间的距离,则容器的容量为 m i n ( x , y ) ∗ t min(x,y)*t min(x,y)t m i n ( x , y ) min(x,y) min(x,y) x x x y y y之间的最小值。双指针算法核心在于:每次计算结束,移动值较小的那个指针,因此需证明为什么不能任意移动指针
采用假设法:
  假设 x < y x<y x<y(即 m i n ( x , y ) = x , m i n ( x , y ) ∗ t = x ∗ t min(x,y)=x,min(x,y)*t=x*t min(x,y)=xmin(x,y)t=xt),若固定 x x x,移动 y y y,则有 m i n ( x , y i ) ∗ t i min(x, y_{i})*t_{i} min(x,yi)ti t i < t t_{i}<t ti<t,因此:

①当 y i < y y_{i}<y yi<y时,若 y i < x y_{i}<x yi<x,则 m i n ( x , y i ) < m i n ( x , y ) min(x, y_{i})<min(x,y) min(x,yi)<min(x,y),故 m i n ( x , y i ) ∗ t i < m i n ( x , y ) ∗ t min(x, y_{i})*t_{i}<min(x,y)*t min(x,yi)ti<min(x,y)t
y i > x y_{i}>x yi>x,则 m i n ( x , y i ) = m i n ( x , y ) = x min(x, y_{i})=min(x,y)=x min(x,yi)=min(x,y)=x,又 t i < t t_{i}<t ti<t,故 m i n ( x , y i ) ∗ t i < m i n ( x , y ) ∗ t min(x, y_{i})*t_{i}<min(x,y)*t min(x,yi)ti<min(x,y)t

②当 y i > = y y_{i}>=y yi>=y时, m i n ( x , y i ) = m i n ( x , y ) = x min(x, y_{i})=min(x,y)=x min(x,yi)=min(x,y)=x,又 t i < t t_{i}<t ti<t,故 m i n ( x , y i ) ∗ t i < m i n ( x , y ) ∗ t min(x, y_{i})*t_{i}<min(x,y)*t min(x,yi)ti<min(x,y)t
因此当固定住值较小的那个指针时,无论怎样移动另一个指针,都不会存在大于 m i n ( x , y ) ∗ t min(x,y)*t min(x,y)t的值。同理可证移动左指针。
在这里插入图片描述
代码:

class Solution {
public:
    int maxArea(vector<int>& height) {
        int result = 0;
        for(int i=0, j=height.size()-1; i<j;){
            int temp = 0;
            if(height[i] < height[j]){
                temp = height[i] * (j - i);
                i++;
            } else {
                temp = height[j] * (j - i);
                j--;
            }
            if(temp > result){
                result = temp;
            }
        }
        return result;
    }
};

12. 整数转罗马数字

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

字符数值
I1
V5
X10
L50
C100
D500
M1000

例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给你一个整数,将其转为罗马数字。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/integer-to-roman
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

在这里插入图片描述


class Solution {
public:
    string intToRoman(int num) {
        string TH[4] = {"", "M", "MM", "MMM"};
        string HU[10] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
        string DE[10] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
        string UN[10] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
        int th = num / 1000;
        num = num % 1000;
        int hu = num / 100;
        num = num % 100;
        int de = num / 10;
        num = num % 10;
        int un = num;
        return TH[th]+HU[hu]+DE[de]+UN[un];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于力扣刷题C++常用操作,我可以给你一些常见的操作和技巧: 1. 使用 STL 容器和算法库:STL(Standard Template Library)是 C++ 标准库中的一个重要组成部分,包含了许多常用的容器和算法。在力扣刷题中,使用 STL 可以大大提高代码的效率和可读性。例如,vector 可以用来存储动态数组,sort 可以用来排序等等。 2. 使用 auto 关键字:auto 关键字可以自动推导变量类型,可以减少代码量和提高可读性。例如,auto x = 1; 可以自动推导出 x 的类型为 int。 3. 使用 lambda 表达式:lambda 表达式是 C++11 中引入的一种匿名函数,可以方便地定义一些简单的函数对象。在力扣刷题中,使用 lambda 表达式可以简化代码,例如在 sort 函数中自定义比较函数。 4. 使用位运算:位运算是一种高效的运算方式,在力扣刷题中经常会用到。例如,左移运算符 << 可以用来计算 2 的幂次方,右移运算符 >> 可以用来除以 2 等等。 5. 使用递归:递归是一种常见的算法思想,在力扣刷题中也经常会用到。例如,二叉树的遍历、链表的反转等等。 6. 使用 STL 中的 priority_queue:priority_queue 是 STL 中的一个容器,可以用来实现堆。在力扣刷题中,使用 priority_queue 可以方便地实现一些需要维护最大值或最小值的算法。 7. 使用 STL 中的 unordered_map:unordered_map 是 STL 中的一个容器,可以用来实现哈希表。在力扣刷题中,使用 unordered_map 可以方便地实现一些需要快速查找和插入的算法。 8. 使用 STL 中的 string:string 是 STL 中的一个容器,可以用来存储字符串。在力扣刷题中,使用 string 可以方便地处理字符串相关的问题。 9. 注意边界条件:在力扣刷题中,边界条件往往是解决问题的关键。需要仔细分析题目,考虑各种边界情况,避免出现错误。 10. 注意时间复杂度:在力扣刷题中,时间复杂度往往是评判代码优劣的重要指标。需要仔细分析算法的时间复杂度,并尽可能优化代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值