b_lc_合并若干三元组以形成目标三元组(思维=逻辑严密)

给你一个二维整数数组 triplets ,其中 triplets[i] = [ai, bi, ci] 表示第 i 个 三元组 。
同时,给你一个整数数组 target = [x, y, z] ,表示你想要得到的 三元组 。
为了得到 target ,你需要对 triplets 执行下面的操作 任意次(可能 零 次):

  • 选出两个下标(下标 从 0 开始 计数)i 和 j(i != j),并 更新 triplets[j] 为 [max(ai, aj), max(bi, bj), max(ci, cj)] 。
  • 例如,triplets[i] = [2, 5, 3] 且 triplets[j] = [1, 7, 5],triplets[j] 将会更新为 [max(2, 1), max(5, 7), max(3, 5)] = [2, 7, 5] 。

如果通过以上操作我们可以使得目标 三元组 target 成为 triplets 的一个 元素 ,则返回 true ;否则,返回 false 。

输入:triplets = [[2,5,3],[1,8,4],[1,7,5]], target = [2,7,5]
输出:true
解释:执行下述操作:
- 选择第一个和最后一个三元组 [[2,5,3],[1,8,4],[1,7,5]] 。
更新最后一个三元组为 [max(2,1), max(5,7), max(3,5)] = [2,7,5] 。triplets = [[2,5,3],[1,8,4],[2,7,5]]
目标三元组 [2,7,5] 现在是 triplets 的一个元素。

思维:每个三元组都可以被选多次,但由于选多次是没有意义的,因为要取的是最大值,所以只需要判断三元组中有没有满足
=x <= y <= z
<=x = y <= z
<=x <= y = z
有没有满足这三个条件的三元组

因为如果三种情况都覆盖到了的话,就一定可以凑成 =x,=y,=z 的三元组,

class Solution {
public:
    bool mergeTriplets(vector<vector<int>>& A, vector<int>& t) {
        bool b1 = false, b2 = false, b3 = false;
        for (auto& a : A) {
            if (a[0] == t[0] && a[1] <= t[1] && a[2] <= t[2]) {
                b1 = 1;
            }
            if (a[0] <= t[0] && a[1] == t[1] && a[2] <= t[2]) {
                b2 = 1;
            }
            if (a[0] <= t[0] && a[1] <= t[1] && a[2] == t[2]) {
                b3 = 1;
            }
        }
        return b1 && b2 && b3;
    }
};
posted @ 2021-06-13 15:10  童年の波鞋  阅读(46)  评论(0编辑  收藏  举报