915. Partition Array into Disjoint Intervals

题目传送门

题目分析

这个题目中我们需要维护leftmax,当我们的leftmax比剩余数组元素都小是我们就可以将我们的断点进行返回了,但如果我们搜寻过程中遇到了更小的点,则将此点更新为新的断点。由于更新断点的过程中需要重置leftmax,所以我们会记录下向右试探过程中的最大值,这个思路的最后结果就是第一个算法。
题主分享了一个答案,思路更为清晰,他记录下了A[:i]的最大值和A[i:]的最小值,然后依次循环遍历,当leftmax < rightmin时这个点就成立。

代码

思路 1

class Solution {
public:
    int partitionDisjoint(vector<int>& A) {
        int leftmax = A[0], splitpoint = 0, i = 0;
        while(i < A.size()){
            if(A[i] < leftmax)
                splitpoint = i++;
            else if(A[i] > leftmax){
                int max = leftmax;
                while(i < A.size()){
                    if(A[i] > max)
                        max = A[i];
                    if(A[i] < leftmax)
                        break;
                    i++;
                }
                if(i == A.size())
                    return splitpoint + 1;
                leftmax = max;
                splitpoint = i;
            }else
                i++;
        }
        return splitpoint + 1;     
    }
};

思路 2

class Solution {
public:
    int partitionDisjoint(vector<int>& A) {
        vector<int> leftmax(A.size()), rightmin(A.size);
        int lmax, rmin, loc;
        lmax = leftmax[0] = A[0];
        for(int i = 1; i < A.size(); i++)
            lmax = leftmax[i] = max(leftmax[i - 1], A[i]);

        rmin = rightmin[A.size() - 1] = A[A.size() - 1];
        for(int i = A.size() - 2; i >= 0; i--)
            rmin = rightmin[i] = min(rightmin[i + 1], A[i]);
        
        for(loc = 0; loc < A.size() - 1; loc++)
            if(leftmax[loc] <= rightmin[loc + 1])
                break;
        return loc + 1;
    }
};
`list.partition()` 和 `set.partition()` 是两种不同的方法,用于不同的数据类型。 `list.partition()` 是 Python 内置的列表方法,它接受一个谓词函数作为参数,并将列表拆分为两个部分:满足谓词函数的元素和不满足谓词函数的元素。它返回一个元组,其中第一个元素是满足谓词函数的元素列表,第二个元素是不满足谓词函数的元素列表,第三个元素是剩余的元素列表(如果有的话)。 例如,假设我们有一个整数列表 `[1, 2, 3, 4, 5, 6]`,我们想要将它们分为奇数和偶数两部分,可以使用 `list.partition()` 方法: ```python nums = [1, 2, 3, 4, 5, 6] odd, even, rest = nums.partition(lambda x: x % 2 != 0) print(odd) # [1, 3, 5] print(even) # [2, 4, 6] print(rest) # [] ``` `set.partition()` 并不是 Python 内置的方法,因为 `set` 类型本身就不保留项目的顺序。因此,`set.partition()` 不是一个有效的方法。 不过,我们可以通过手动编写代码来模拟 `set.partition()` 的行为。例如,假设我们有一个字符串集合 `{'apple', 'banana', 'cherry', 'date'}`,我们想要将它们分为两部分:以字母 'a' 开头的字符串和不以字母 'a' 开头的字符串。我们可以使用以下代码: ```python strings = {'apple', 'banana', 'cherry', 'date'} a_start = set(filter(lambda s: s.startswith('a'), strings)) not_a_start = strings - a_start print(a_start) # {'apple'} print(not_a_start) # {'banana', 'cherry', 'date'} ``` 这段代码使用了 Python 内置的 `filter()` 函数和 `set` 类型的差集运算。它首先使用 `filter()` 函数找到以字母 'a' 开头的字符串,然后使用差集运算将它们从原始集合中移除,得到不以字母 'a' 开头的字符串集合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值