前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2023-12-06:用go语言,给你一个由 n 个数对组成的数对数组 pairs, 其中 pairs[i] = [lefti,

2023-12-06:用go语言,给你一个由 n 个数对组成的数对数组 pairs, 其中 pairs[i] = [lefti,

作者头像
福大大架构师每日一题
发布2023-12-13 11:30:33
1520
发布2023-12-13 11:30:33
举报
文章被收录于专栏:福大大架构师每日一题

2023-12-06:用go语言,给你一个由 n 个数对组成的数对数组 pairs,

其中 pairs[i] = [lefti, righti] 且 lefti < righti 。

现在,我们定义一种 跟随 关系,当且仅当 b < c 时,

数对 p2 = [c, d] 才可以跟在 p1 = [a, b] 后面,

我们用这种形式来构造 数对链。

找出并返回能够形成的 最长数对链的长度。

你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。

输入:pairs = [[1,2], [2,3], [3,4]]。

输出:2。

答案2023-12-06:

灵捷3.5

大体步骤如下:

1.首先对数对数组 pairs 按照左边界进行排序,确保数对按照左边界的升序排列。

2.创建一个大小为 n 的整型数组 ends,用于存储当前数对链中每个数对的右边界值。

3.初始化变量 size 为 0,表示当前数对链的长度。

4.遍历排序后的数对数组 pairs:

  • • 对于每个数对 pair,使用二分搜索找到 ends 数组中第一个大于等于 pair[0] 的索引 find。
  • • 如果找不到这样的索引,则将 pair[1] 添加到 ends 数组末尾,并将 size 加一。
  • • 如果找到了索引 find,则更新 ends[find] 的值为 min(ends[find], pair[1])。这是因为我们要构建最长数对链,所以应该选择右边界更小的数对。

5.返回变量 size 即为能够形成的最长数对链长度。

总的时间复杂度:在排序和遍历过程中,都需要 O(n log n) 的时间复杂度(排序花费 O(n log n),遍历花费 O(n))。而二分搜索操作也需要 O(log n) 的时间复杂度。所以总体上是 O(n log n)。

总的额外空间复杂度:除了存储输入数据之外,我们额外使用了一个大小为 n 的数组 ends 来存储数对链的右边界。因此,额外空间复杂度是 O(n)。

go完整代码如下:

代码语言:javascript
复制
package main

import (
    "fmt"
    "sort"
)

func findLongestChain(pairs [][]int) int {
    n := len(pairs)
    sort.Slice(pairs, func(i, j int) bool {
        return pairs[i][0] < pairs[j][0]
    })
    
    ends := make([]int, n)
    size := 0
    
    for _, pair := range pairs {
        l, r := 0, size-1
        m, find := 0, -1
        
        for l <= r {
            m = (l + r) / 2
            
            if ends[m] >= pair[0] {
                find = m
                r = m - 1
            } else {
                l = m + 1
            }
        }
        
        if find == -1 {
            ends[size] = pair[1]
            size++
        } else {
            if ends[find] > pair[1] {
                ends[find] = pair[1]
            }
        }
        
    }
    
    return size
}

func main() {
    pairs := [][]int{{1,2}, {2,3}, {3,4}}
    result := findLongestChain(pairs)
    fmt.Println(result)
}

在这里插入图片描述

rust完整代码如下:

代码语言:javascript
复制
fn find_longest_chain(pairs: Vec<Vec<i32>>) -> i32 {
    let mut pairs = pairs;
    pairs.sort_by(|a, b| a[0].cmp(&b[0]));

    let n = pairs.len() as i32;
    let mut ends = vec![0; n as usize];
    let mut size: i32 = 0;

    for pair in &pairs {
        let (mut l, mut r) = (0, size - 1);
        let (mut m, mut find) = (0, -1);

        while l <= r {
            m = (l + r) / 2;

            if ends[m as usize] >= pair[0] {
                find = m;
                r = m - 1;
            } else {
                l = m + 1;
            }
        }

        if find == -1 {
            ends[size as usize] = pair[1];
            size += 1;
        } else {
            ends[find as usize] = ends[find as usize].min(pair[1]);
        }
    }

    size as i32
}

fn main() {
    let pairs: Vec<Vec<i32>> = vec![vec![1, 2], vec![2, 3], vec![3, 4]];
    let result = find_longest_chain(pairs);
    println!("{}", result);
}

在这里插入图片描述

c++完整代码如下:

代码语言:javascript
复制
#include <iostream>
#include <vector>
#include <algorithm>

int findLongestChain(std::vector<std::vector<int>>& pairs) {
    int n = pairs.size();
    std::sort(pairs.begin(), pairs.end(), [](const std::vector<int>& a, const std::vector<int>& b) {
        return a[0] < b[0];
        });

    std::vector<int> ends(n, 0);
    int size = 0;

    for (const auto& pair : pairs) {
        int l = 0;
        int r = size - 1;
        int m = 0;
        int find = -1;

        while (l <= r) {
            m = (l + r) / 2;

            if (ends[m] >= pair[0]) {
                find = m;
                r = m - 1;
            }
            else {
                l = m + 1;
            }
        }

        if (find == -1) {
            ends[size++] = pair[1];
        }
        else {
            ends[find] = std::min(ends[find], pair[1]);
        }
    }

    return size;
}

int main() {
    std::vector<std::vector<int>> pairs{ {1,2}, {2,3}, {3,4} };

    int result = findLongestChain(pairs);

    std::cout << result << std::endl;

    return 0;
}

在这里插入图片描述

c完整代码如下:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

int findLongestChain(int** pairs, int pairsSize, int* pairsColSize) {
    // 根据第一列排序
    for (int i = 0; i < pairsSize; i++) {
        for (int j = 0; j < pairsSize - i - 1; j++) {
            if (pairs[j][0] > pairs[j + 1][0]) {
                int* temp = pairs[j];
                pairs[j] = pairs[j + 1];
                pairs[j + 1] = temp;
            }
        }
    }

    int* ends = (int*)malloc(sizeof(int) * pairsSize);
    int size = 0;

    for (int i = 0; i < pairsSize; i++) {
        int l = 0;
        int r = size - 1;
        int m = 0;
        int find = -1;

        while (l <= r) {
            m = (l + r) / 2;

            if (ends[m] >= pairs[i][0]) {
                find = m;
                r = m - 1;
            }
            else {
                l = m + 1;
            }
        }

        if (find == -1) {
            ends[size++] = pairs[i][1];
        }
        else {
            ends[find] = ends[find] < pairs[i][1] ? ends[find] : pairs[i][1];
        }
    }

    free(ends);

    return size;
}

int main() {
    // 输入数据
    int pair_1[] = { 1, 2 };
    int pair_2[] = { 2, 3 };
    int pair_3[] = { 3, 4 };

    int* pairs[] = { pair_1, pair_2, pair_3 };
    int pairsSize = sizeof(pairs) / sizeof(pairs[0]);
    int pairsColSize[] = { 2, 2, 2 };

    int result = findLongestChain(pairs, pairsSize, pairsColSize);
    printf("%d\n", result);

    return 0;
}

在这里插入图片描述

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-12-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 大体步骤如下:
  • go完整代码如下:
  • rust完整代码如下:
  • c++完整代码如下:
  • c完整代码如下:
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档