Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >2023-09-10:用go语言编写。作为项目经理,你规划了一份需求的技能清单 req_skills, 并打算从备选人员名单 p

2023-09-10:用go语言编写。作为项目经理,你规划了一份需求的技能清单 req_skills, 并打算从备选人员名单 p

作者头像
福大大架构师每日一题
发布于 2023-09-19 07:40:33
发布于 2023-09-19 07:40:33
19900
代码可运行
举报
运行总次数:0
代码可运行

2023-09-10:用go语言编写。作为项目经理,你规划了一份需求的技能清单 req_skills,

并打算从备选人员名单 people 中选出些人组成一个「必要团队」

( 编号为 i 的备选人员 people[i] 含有一份该备选人员掌握的技能列表)。

所谓「必要团队」,就是在这个团队中,

对于所需求的技能列表 req_skills 中列出的每项技能,

团队中至少有一名成员已经掌握。可以用每个人的编号来表示团队中的成员:

例如,团队 team = [0, 1, 3] 表示掌握技能分别为

people[0],people[1],和 people[3] 的备选人员。

请你返回 任一 规模最小的必要团队,团队成员用人员编号表示。

你可以按 任意顺序 返回答案,题目数据保证答案存在。

输入:req_skills = ["java","nodejs","reactjs"], people = [["java"],["nodejs"],["nodejs","reactjs"]]。

输出:[0,2]。

来自左程云。

答案2023-09-10:

大体步骤如下:

1.首先,我们对 reqSkills 进行排序,获得排序后的技能列表。这是为了后续方便进行比较。例如,将 ["java", "nodejs", "reactjs"] 排序为 ["java", "nodejs", "reactjs"]。

2.初始化变量 n 为 reqSkills 的长度,变量 m 为 people 的长度,并创建一个长度为 m 的整数数组 statuses 用于记录每个人的技能状态。

3.对于每个人,我们通过比较技能列表和排序后的 reqSkills 列表,来确定他们掌握的技能状态。首先,将该人的技能列表排序。然后使用双指针法,一个指针指向排序后的 reqSkills 列表,另一个指针指向该人的技能列表。比较两个指针指向的技能,如果相等,则表示该人掌握了该技能,将对应的状态位置为1,并将两个指针都向后移动一位;如果 reqSkills[p1] 小于 skill[p2],则将指向 reqSkills 的指针向后移动一位;否则将指向技能列表的指针向后移动一位。重复这个过程直到其中一个指针超出范围。

4.将每个人的技能状态记录在 statuses 数组中。

5.创建一个二维数组 dp,其中 dp[i][j] 表示从第 i 个人开始,技能状态为 j 时,所需的最小团队人数。初始化 dp 数组的所有元素为 -1。

6.调用递归函数 process,该函数的参数包括:people 数组,技能列表的长度 n,当前处理的人员下标 i,当前的技能状态 status,以及 dp 数组。

7.在递归函数 process 中,首先判断当前技能状态是否已经满足所有需求,即 status 是否等于 (1<<n)-1。如果满足,则返回0表示不需要再增加人员。

8.接下来,判断是否已经遍历了所有人员,即 i 是否等于 people 数组的长度。如果是,说明无法满足所有需求,并返回一个较大的值,这里使用 1<<31-1 来表示无穷大。

9.然后,判断 dp 数组中是否已经记录了当前人员和技能状态的最小团队人数,如果是,直接返回该值。

10.在递归函数中,我们有两个递归调用,第一个是继续尝试从下一个人员开始不增加人员的情况,即调用 process(people, n, i+1, status, dp),将返回的值保存在变量 p1 中。

11.第二个递归调用是尝试从下一个人员开始增加当前人员的情况,即调用 process(people, n, i+1, status|people[i], dp),将返回的值保存在变量 p2 中。注意,这里的参数 status|people[i] 表示将当前人员的技能状态添加到当前技能状态中。

12.如果 p2 不等于 1<<31-1,说明可以满足当前需求,将 p2+1 指代的团队人数保存在变量 ans 中,否则将 ans 设置为 p1。

13.将 ans 保存在 dp 数组中以便下次使用,并返回 ans。

14.在主函数中,根据返回的最小团队人数 size,创建一个大小为 size 的整数数组 ans 和一个指示 ans 数组下标的变量 ansi。

15.初始化变量 i 为0,status 为0,用于记录当前处理的人员下标和技能状态。

16.如果 status 不等于 (1<<n)-1,即还没有满足所有需求,执行循环。在循环中,判断两个条件:如果 i+1 等于 m,说明已经遍历到了最后一个人员;如果 dp[i][status] 不等于 dp[i+1][status],表示从当前人员开始增加人员可以满足当前需求。

17.如果满足上述两个条件之一,将 i 添加到 ans 数组中,并将 ansi 自增1。然后将当前人员的技能状态添加到当前技能状态中。

18.无论是否满足条件,将 i 自增1。

19.执行完循环后,返回 ans 数组作为结果。

总的时间复杂度为O(m * (2^n)),额外空间复杂度为O(m * (2^n))。

go完整代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
    "fmt"
    "sort"
)

func smallestSufficientTeam(reqSkills []string, people [][]string) []int {
    sort.Strings(reqSkills)
    n := len(reqSkills)
    m := len(people)
    statuses := make([]int, m)
    for i := 0; i < m; i++ {
        skillStatus := 0
        skill := people[i]
        sort.Strings(skill)
        p1, p2 := 0, 0
        for p1 < n && p2 < len(skill) {
            compare := reqSkills[p1] == skill[p2]
            if compare {
                skillStatus |= 1 << p1
                p1++
                p2++
            } else if reqSkills[p1] < skill[p2] {
                p1++
            } else {
                p2++
            }
        }
        statuses[i] = skillStatus
    }

    dp := make([][]int, m)
    for i := 0; i < m; i++ {
        dp[i] = make([]int, 1<<n)
        for j := 0; j < 1<<n; j++ {
            dp[i][j] = -1
        }
    }

    size := process(statuses, n, 0, 0, dp)
    ans := make([]int, size)
    ansi := 0
    i := 0
    status := 0
    for status != (1<<n)-1 {
        if i+1 == m || dp[i][status] != dp[i+1][status] {
            ans[ansi] = i
            ansi++
            status |= statuses[i]
        }
        i++
    }
    return ans
}

func process(people []int, n, i, status int, dp [][]int) int {
    if status == (1<<n)-1 {
        return 0
    }
    if i == len(people) {
        return 1<<31 - 1
    }
    if dp[i][status] != -1 {
        return dp[i][status]
    }
    p1 := process(people, n, i+1, status, dp)
    p2 := 1<<31 - 1
    next2 := process(people, n, i+1, status|people[i], dp)
    if next2 != 1<<31-1 {
        p2 = 1 + next2
    }
    ans := min(p1, p2)
    dp[i][status] = ans
    return ans
}

func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}

func main() {
    reqSkills := []string{"java", "nodejs", "reactjs"}
    people := [][]string{{"java"}, {"nodejs"}, {"nodejs", "reactjs"}}

    result := smallestSufficientTeam(reqSkills, people)
    fmt.Println(result)
}

在这里插入图片描述

rust完整代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fn smallest_sufficient_team(req_skills: Vec<String>, people: Vec<Vec<String>>) -> Vec<i32> {
    let n = req_skills.len();
    let m = people.len();
    let mut statuses = vec![0; m];
    for (i, skill) in people.iter().enumerate() {
        let mut skill_status = 0;
        let mut sorted_skill = skill.clone();
        sorted_skill.sort();
        let mut p1 = 0;
        let mut p2 = 0;
        while p1 < n && p2 < sorted_skill.len() {
            match req_skills[p1].cmp(&sorted_skill[p2]) {
                std::cmp::Ordering::Less => p1 += 1,
                std::cmp::Ordering::Greater => p2 += 1,
                std::cmp::Ordering::Equal => {
                    skill_status |= 1 << p1;
                    p1 += 1;
                    p2 += 1;
                }
            }
        }
        statuses[i] = skill_status;
    }

    let mut dp = vec![vec![-1; 1 << n]; m];
    let size = process(&statuses, n, 0, 0, &mut dp);
    let mut ans = vec![0; size as usize];
    let mut ansi = 0;
    let mut i = 0;
    let mut status: i32 = 0;

    while status != (1 << n) - 1 {
        if i + 1 == m || dp[i][status as usize] != dp[i + 1][status as usize] {
            ans[ansi] = i as i32;
            ansi += 1;
            status |= statuses[i as usize];
        }
        i += 1;
    }

    ans
}

fn process(people: &[i32], n: usize, i: usize, status: i32, dp: &mut Vec<Vec<i32>>) -> i32 {
    if status == (1 << n) - 1 {
        return 0;
    }

    if i == people.len() {
        return i32::MAX;
    }

    if dp[i][status as usize] != -1 {
        return dp[i][status as usize];
    }

    let p1 = process(people, n, i + 1, status, dp);
    let mut p2 = i32::MAX;
    let next2 = process(people, n, i + 1, status | people[i], dp);
    if next2 != i32::MAX {
        p2 = 1 + next2;
    }

    let ans = p1.min(p2);
    dp[i][status as usize] = ans;
    ans
}

fn main() {
    let req_skills = vec![
        "java".to_string(),
        "nodejs".to_string(),
        "reactjs".to_string(),
    ];
    let people = vec![
        vec!["java".to_string()],
        vec!["nodejs".to_string()],
        vec!["nodejs".to_string(), "reactjs".to_string()],
    ];
    let result = smallest_sufficient_team(req_skills, people);
    println!("{:?}", result);
}

在这里插入图片描述

c++完整代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <cmath>

using namespace std;

int process(const vector<int>& people, int n, int i, int status, unordered_map<int, int>& dp) {
    if (status == (1 << n) - 1) {
        return 0;
    }
    if (i == people.size()) {
        return INT_MAX;
    }
    int key = (i << n) | status;
    if (dp.find(key) != dp.end()) {
        return dp[key];
    }
    int p1 = process(people, n, i + 1, status, dp);
    int p2 = INT_MAX;
    int next2 = process(people, n, i + 1, status | people[i], dp);
    if (next2 != INT_MAX) {
        p2 = 1 + next2;
    }
    int ans = min(p1, p2);
    dp[key] = ans;
    return ans;
}

vector<int> smallestSufficientTeam(vector<string>& req_skills, vector<vector<string>>& people) {
    unordered_map<string, int> skillMap;
    int count = 0;
    for (const string& skill : req_skills) {
        skillMap[skill] = count++;
    }
    int n = count;
    int m = people.size();
    vector<int> statuses(m);
    for (int i = 0; i < m; i++) {
        int skillStatus = 0;
        const vector<string>& skills = people[i];
        for (const string& skill : skills) {
            skillStatus |= 1 << skillMap[skill];
        }
        statuses[i] = skillStatus;
    }
    unordered_map<int, int> dp;
    int size = process(statuses, n, 0, 0, dp);
    vector<int> ans;
    int i = 0, status = 0;
    while (status != (1 << n) - 1) {
        if (i + 1 == m || dp[i << n | status] != dp[(i + 1) << n | status]) {
            ans.push_back(i);
            status |= statuses[i];
        }
        i++;
    }
    return ans;
}

int main() {
    vector<string> req_skills = { "java", "nodejs", "reactjs" };
    vector<vector<string>> people = { {"java"}, {"nodejs"}, {"nodejs", "reactjs"} };

    vector<int> team = smallestSufficientTeam(req_skills, people);
    cout << "Team members: ";
    for (int member : team) {
        cout << member << " ";
    }
    cout << endl;

    return 0;
}

在这里插入图片描述

c完整代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    int* data;
    int size;
    int capacity;
} IntArray;

IntArray* createIntArray() {
    IntArray* arr = (IntArray*)malloc(sizeof(IntArray));
    arr->data = NULL;
    arr->size = 0;
    arr->capacity = 0;
    return arr;
}

void append(IntArray* arr, int value) {
    if (arr->size >= arr->capacity) {
        int newCapacity = arr->capacity == 0 ? 1 : arr->capacity * 2;
        int* newData = (int*)malloc(sizeof(int) * newCapacity);
        if (arr->data != NULL) {
            memcpy(newData, arr->data, sizeof(int) * arr->size);
            free(arr->data);
        }
        arr->data = newData;
        arr->capacity = newCapacity;
    }
    arr->data[arr->size++] = value;
}

void destroyIntArray(IntArray* arr) {
    if (arr != NULL) {
        if (arr->data != NULL) {
            free(arr->data);
        }
        free(arr);
    }
}

int findSkillIndex(char** skills, int skillsSize, char* target) {
    for (int i = 0; i < skillsSize; i++) {
        if (strcmp(skills[i], target) == 0) {
            return i;
        }
    }
    return -1;
}

void smallestSufficientTeam(char** req_skills, int req_skillsSize, char*** people, int peopleSize, int* peopleColSize, int* returnSize, int** returnArray) {
    char** skills = (char**)malloc(sizeof(char*) * req_skillsSize);
    for (int i = 0; i < req_skillsSize; i++) {
        skills[i] = _strdup(req_skills[i]);
    }

    int n = req_skillsSize;
    int m = peopleSize;
    int* statuses = (int*)malloc(sizeof(int) * m);

    for (int i = 0; i < m; i++) {
        int skillStatus = 0;
        for (int j = 0; j < peopleColSize[i]; j++) {
            int skillIndex = findSkillIndex(skills, req_skillsSize, people[i][j]);
            if (skillIndex != -1) {
                skillStatus |= 1 << skillIndex;
            }
        }
        statuses[i] = skillStatus;
    }

    int** dp = (int**)malloc(sizeof(int*) * m);
    for (int i = 0; i < m; i++) {
        dp[i] = (int*)malloc(sizeof(int) * (1 << n));
        for (int j = 0; j < (1 << n); j++) {
            dp[i][j] = -1;
        }
    }

    int size = process(statuses, n, 0, 0, dp);

    *returnSize = size;
    *returnArray = (int*)malloc(sizeof(int) * size);
    int index = 0;
    int i = 0;
    int status = 0;

    while (status != (1 << n) - 1) {
        if (i + 1 == m || dp[i][status] != dp[i + 1][status]) {
            (*returnArray)[index++] = i;
            status |= statuses[i];
        }
        i++;
    }

    for (int i = 0; i < m; i++) {
        free(dp[i]);
    }
    free(dp);

    for (int i = 0; i < req_skillsSize; i++) {
        free(skills[i]);
    }
    free(skills);
    free(statuses);
}

int process(int* people, int n, int i, int status, int** dp) {
    if (status == (1 << n) - 1) {
        return 0;
    }
    if (i == n) {
        return INT_MAX;
    }
    if (dp[i][status] != -1) {
        return dp[i][status];
    }

    int p1 = process(people, n, i + 1, status, dp);

    int p2 = INT_MAX;
    int next2 = process(people, n, i + 1, status | people[i], dp);
    if (next2 != INT_MAX) {
        p2 = 1 + next2;
    }

    int ans = p1 < p2 ? p1 : p2;
    dp[i][status] = ans;
    return ans;
}

int main() {
    char* req_skills[] = { "java", "nodejs", "reactjs" };
    int req_skillsSize = sizeof(req_skills) / sizeof(req_skills[0]);

    char** people[] = {
        (char* []) {
"java"
},
  (char* []) {
"nodejs"
},
(char* []) {
"nodejs", "reactjs"
}
    };
    int peopleSize = sizeof(people) / sizeof(people[0]);
    int peopleColSize[] = { 1, 1, 2 };

    int returnSize;
    int* returnArray;

    smallestSufficientTeam(req_skills, req_skillsSize, people, peopleSize, peopleColSize, &returnSize, &returnArray);

    printf("Smallest Sufficient Team:\n");
    for (int i = 0; i < returnSize; i++) {
        printf("%d ", returnArray[i]);
    }
    printf("\n");

    free(returnArray);

    return 0;
}

在这里插入图片描述

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2023-01-14:给定一个二维数组map,代表一个餐厅,其中只有0、1两种值 map[i][j] == 0 表示(i,j)位置是空座 map[i][j] =
2023-01-14:给定一个二维数组map,代表一个餐厅,其中只有0、1两种值mapi == 0 表示(i,j)位置是空座mapi == 1 表示(i,j)位置坐了人根据防疫要求,任何人的上、下、左、右,四个相邻的方向都不能再坐人但是为了餐厅利用的最大化,也许还能在不违反防疫要求的情况下,继续安排人吃饭请返回还能安排的最大人数如果一开始的状况已经不合法,直接返回-1比如:1 0 0 00 0 0 1不违反防疫要求的情况下,这个餐厅最多还能安排2人,如下所示,X是新安排的人1 0 X 00 X 0 1再比如
福大大架构师每日一题
2023/01/14
5140
2023-01-14:给定一个二维数组map,代表一个餐厅,其中只有0、1两种值 map[i][j] == 0 表示(i,j)位置是空座 map[i][j] =
2023-01-12:一个n*n的二维数组中,只有0和1两种值, 当你决定在某个位置操作一次, 那么该位置的行和列整体都会变成1,不管之前是什么状态。 返回让所
2023-01-12:一个n*n的二维数组中,只有0和1两种值,当你决定在某个位置操作一次,那么该位置的行和列整体都会变成1,不管之前是什么状态。返回让所有值全变成1,最少的操作次数。1 < n < 10,没错!原题就是说n < 10, 不会到10!最多到9!来自华为。答案2023-01-12:四维dp+贪心。这道题优化力度很有限,跟暴力差不多。代码用rust和solidity编写。代码用solidity编写。代码如下:// SPDX-License-Identifier: MITpragma solidi
福大大架构师每日一题
2023/01/12
1.8K0
2023-01-12:一个n*n的二维数组中,只有0和1两种值, 当你决定在某个位置操作一次, 那么该位置的行和列整体都会变成1,不管之前是什么状态。 返回让所
2024-01-03:用go语言,给你两个长度为 n 下标从 0 开始的整数数组 cost 和 time, 分别表示给 n 堵不
2024-01-03:用go语言,给你两个长度为 n 下标从 0 开始的整数数组 cost 和 time,
福大大架构师每日一题
2024/01/05
1750
2024-01-03:用go语言,给你两个长度为 n 下标从 0 开始的整数数组 cost 和 time, 分别表示给 n 堵不
2023-03-02:给定一个数组arr,长度为n, 任意相邻的两个数里面至少要有一个被选出来,组成子序列,才是合法的! 求所有可能的合法子序列中,最大中位数是
2023-03-02:给定一个数组arr,长度为n,任意相邻的两个数里面至少要有一个被选出来,组成子序列,才是合法的!求所有可能的合法子序列中,最大中位数是多少?中位数的定义为上中位数,1, 2, 3, 4的上中位数是2,1, 2, 3, 4, 5的上中位数是3,2 <= n <= 10^5,1 <= arri <= 10^9。来自京东。实习岗位笔试题。答案2023-03-02:这道题看起来是实习题,实际上有难度。方法一:要i还是不要i,递归或者动态规划。方法二:以结果为导向,二分法。时间复杂度:O(N*
福大大架构师每日一题
2023/03/02
5360
2023-03-02:给定一个数组arr,长度为n, 任意相邻的两个数里面至少要有一个被选出来,组成子序列,才是合法的! 求所有可能的合法子序列中,最大中位数是
2022-08-06:给定一个数组arr,长度为N,arr中所有的值都在1~K范围上, 你可以删除数字,目的是让arr的最长递增子序列长度小于K。 返回至少删除
2022-08-06:给定一个数组arr,长度为N,arr中所有的值都在1~K范围上,
福大大架构师每日一题
2022/08/06
9170
2022-08-06:给定一个数组arr,长度为N,arr中所有的值都在1~K范围上, 你可以删除数字,目的是让arr的最长递增子序列长度小于K。 返回至少删除
2022-08-12:方案1 : {7, 10}; xxxx : {a , b}; 1 2 3 4; FunnyGoal = 100; OffenseGoal
在让restFunny和restOffense都小于等于0的要求下,返回最少的贴纸数量。
福大大架构师每日一题
2022/08/12
3660
2022-08-12:方案1 : {7, 10}; xxxx : {a , b}; 1 2 3 4; FunnyGoal = 100; OffenseGoal
2023-08-30:用go语言编写。两个魔法卷轴问题。 给定一个数组arr,其中可能有正、负、0, 一个魔法卷轴可以把arr中
5.调用函数mustOneScroll(arr, 0, n-1),返回一个整数,并赋值给变量p2。
福大大架构师每日一题
2023/09/01
1860
2023-08-30:用go语言编写。两个魔法卷轴问题。 给定一个数组arr,其中可能有正、负、0, 一个魔法卷轴可以把arr中
2023-05-27:给你一个只包含小写英文字母的字符串 s 。 每一次 操作 ,你可以选择 s 中两个 相邻 的字符,并将它们交换。 请你返回将 s 变成回文
1.定义结构体 IndexTree,其中包含一个整型切片 tree 和整型变量 n,用于实现树状数组。
福大大架构师每日一题
2023/05/27
3670
2022-06-23:给定一个非负数组,任意选择数字,使累加和最大且为7的倍数,返回最大累加和。 n比较大,10的5次方。 来自美团。3.26笔试。
2022-06-23:给定一个非负数组,任意选择数字,使累加和最大且为7的倍数,返回最大累加和。
福大大架构师每日一题
2022/06/23
2800
2022-06-23:给定一个非负数组,任意选择数字,使累加和最大且为7的倍数,返回最大累加和。 n比较大,10的5次方。 来自美团。3.26笔试。
2023-02-15:商场中有一展柜A,其大小固定,现已被不同的商品摆满, 商家提供了一些新商品B,需要对A中的部分商品进行更新替换, B中的商品可以自由使用,
2023-02-15:商场中有一展柜A,其大小固定,现已被不同的商品摆满,商家提供了一些新商品B,需要对A中的部分商品进行更新替换,B中的商品可以自由使用,也就是可以用B中的任何商品替换A中的任何商品,A中的商品一旦被替换,就认为消失了!而不是回到了B中!要求更新过后的展柜中,商品严格按照价格由低到高进行排列,不能有相邻商品价格相等的情况,Ai为展柜中第i个位置商品的价格,Bi为各个新商品的价格。求能够满足A中商品价格严格递增的最小操作次数,若无法满足则返回-1。答案2023-02-15:动态规划。从左往右
福大大架构师每日一题
2023/02/15
5910
2023-02-15:商场中有一展柜A,其大小固定,现已被不同的商品摆满, 商家提供了一些新商品B,需要对A中的部分商品进行更新替换, B中的商品可以自由使用,
2023-03-29:如何高效计算三条线路选择方案?小A的旅行线路规划问题
2023-03-29:第一行有一个正整数n(3<=n<=100000),代表小A拟定的路线数量
福大大架构师每日一题
2023/03/29
2870
2023-03-29:如何高效计算三条线路选择方案?小A的旅行线路规划问题
2023-09-23:用go语言,假设每一次获得随机数的时候,这个数字大于100的概率是P。 尝试N次,其中大于100的次数在A
2023-09-23:用go语言,假设每一次获得随机数的时候,这个数字大于100的概率是P。
福大大架构师每日一题
2023/09/25
1830
2023-09-23:用go语言,假设每一次获得随机数的时候,这个数字大于100的概率是P。 尝试N次,其中大于100的次数在A
2022-08-22:给定一个数组arr,长度为n,最多可以删除一个连续子数组, 求剩下的数组,严格连续递增的子数组最大长度。 n <= 10^6。 来自字节。
2022-08-22:给定一个数组arr,长度为n,最多可以删除一个连续子数组,求剩下的数组,严格连续递增的子数组最大长度。n <= 10^6。来自字节。5.6笔试。答案2022-08-22:动态规划+线段树。代码用rust编写。代码如下:use rand::Rng;fn main() { let n: i32 = 100; let v: i32 = 20; let test_time: i32 = 50000; println!("测试开始"); for _ in 0..te
福大大架构师每日一题
2022/08/22
4860
2022-08-22:给定一个数组arr,长度为n,最多可以删除一个连续子数组, 求剩下的数组,严格连续递增的子数组最大长度。 n <= 10^6。 来自字节。
2023-03-20:给定一个无向图,保证所有节点连成一棵树,没有环,给定一个正数n为节点数,所以节点编号为0~n-1,那么就一
为了解决此问题,我们可以使用搜索和动态规划技术进行优化,下面将详细介绍两种算法的实现方法。
福大大架构师每日一题
2023/06/08
2760
2023-03-20:给定一个无向图,保证所有节点连成一棵树,没有环,给定一个正数n为节点数,所以节点编号为0~n-1,那么就一
2022-11-09:给定怪兽的血量为hp 第i回合如果用刀砍,怪兽在这回合会直接掉血,没有后续效果 第i回合如果用毒,怪兽在这回合不会掉血, 但是之后每回合都
2022-11-09:给定怪兽的血量为hp第i回合如果用刀砍,怪兽在这回合会直接掉血,没有后续效果第i回合如果用毒,怪兽在这回合不会掉血,但是之后每回合都会掉血,并且所有中毒的后续效果会叠加给定的两个数组cuts、poisons,两个数组等长,长度都是n表示你在n回合内的行动,每一回合的刀砍的效果由cutsi表示每一回合的中毒的效果由poisonsi表示如果你在n个回合内没有直接杀死怪兽,意味着你已经无法有新的行动了但是怪兽如果有中毒效果的话,那么怪兽依然会在hp耗尽的那回合死掉。返回你最快能在多少回合内将
福大大架构师每日一题
2022/11/09
2300
2022-11-09:给定怪兽的血量为hp 第i回合如果用刀砍,怪兽在这回合会直接掉血,没有后续效果 第i回合如果用毒,怪兽在这回合不会掉血, 但是之后每回合都
2023-09-13:用go语言,给定一个整数数组 nums 和一个正整数 k, 找出是否有可能把这个数组分成 k 个非空子集,
第一种算法(canPartitionKSubsets1)使用动态规划的思想,具体过程如下:
福大大架构师每日一题
2023/09/19
2240
2023-09-13:用go语言,给定一个整数数组 nums 和一个正整数 k, 找出是否有可能把这个数组分成 k 个非空子集,
2023-05-06:X轴上有一些机器人和工厂
2023-05-06:X轴上有一些机器人和工厂。给你一个整数数组robot,其中roboti是第i个机器人的位置
福大大架构师每日一题
2023/05/06
2030
2023-05-06:X轴上有一些机器人和工厂
2023-03-18:给定一个长度n的数组,每次可以选择一个数x,让这个数组中所有的x都变成x+1,问你最少的操作次数,使得这个
本题可以用多种算法来解决,下面我们将介绍四种常见的做法,分别是暴力枚举、动态规划、单调栈和差分。
福大大架构师每日一题
2023/06/08
7510
2023-03-18:给定一个长度n的数组,每次可以选择一个数x,让这个数组中所有的x都变成x+1,问你最少的操作次数,使得这个
2023-09-27:用go语言,在一个 n x n 的国际象棋棋盘上,一个骑士从单元格 (row, column) 开始, 并
用go语言,在一个 n x n 的国际象棋棋盘上,一个骑士从单元格 (row, column) 开始,
福大大架构师每日一题
2023/09/28
1770
2023-09-27:用go语言,在一个 n x n 的国际象棋棋盘上,一个骑士从单元格 (row, column) 开始, 并
2023-04-20:有一堆石头,用整数数组 stones 表示 其中 stones[i] 表示第 i 块石头的重量。 每一回合,从中选出任意两块石头,然后将它
如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。
福大大架构师每日一题
2023/04/20
3070
2023-04-20:有一堆石头,用整数数组 stones 表示 其中 stones[i] 表示第 i 块石头的重量。 每一回合,从中选出任意两块石头,然后将它
推荐阅读
2023-01-14:给定一个二维数组map,代表一个餐厅,其中只有0、1两种值 map[i][j] == 0 表示(i,j)位置是空座 map[i][j] =
5140
2023-01-12:一个n*n的二维数组中,只有0和1两种值, 当你决定在某个位置操作一次, 那么该位置的行和列整体都会变成1,不管之前是什么状态。 返回让所
1.8K0
2024-01-03:用go语言,给你两个长度为 n 下标从 0 开始的整数数组 cost 和 time, 分别表示给 n 堵不
1750
2023-03-02:给定一个数组arr,长度为n, 任意相邻的两个数里面至少要有一个被选出来,组成子序列,才是合法的! 求所有可能的合法子序列中,最大中位数是
5360
2022-08-06:给定一个数组arr,长度为N,arr中所有的值都在1~K范围上, 你可以删除数字,目的是让arr的最长递增子序列长度小于K。 返回至少删除
9170
2022-08-12:方案1 : {7, 10}; xxxx : {a , b}; 1 2 3 4; FunnyGoal = 100; OffenseGoal
3660
2023-08-30:用go语言编写。两个魔法卷轴问题。 给定一个数组arr,其中可能有正、负、0, 一个魔法卷轴可以把arr中
1860
2023-05-27:给你一个只包含小写英文字母的字符串 s 。 每一次 操作 ,你可以选择 s 中两个 相邻 的字符,并将它们交换。 请你返回将 s 变成回文
3670
2022-06-23:给定一个非负数组,任意选择数字,使累加和最大且为7的倍数,返回最大累加和。 n比较大,10的5次方。 来自美团。3.26笔试。
2800
2023-02-15:商场中有一展柜A,其大小固定,现已被不同的商品摆满, 商家提供了一些新商品B,需要对A中的部分商品进行更新替换, B中的商品可以自由使用,
5910
2023-03-29:如何高效计算三条线路选择方案?小A的旅行线路规划问题
2870
2023-09-23:用go语言,假设每一次获得随机数的时候,这个数字大于100的概率是P。 尝试N次,其中大于100的次数在A
1830
2022-08-22:给定一个数组arr,长度为n,最多可以删除一个连续子数组, 求剩下的数组,严格连续递增的子数组最大长度。 n <= 10^6。 来自字节。
4860
2023-03-20:给定一个无向图,保证所有节点连成一棵树,没有环,给定一个正数n为节点数,所以节点编号为0~n-1,那么就一
2760
2022-11-09:给定怪兽的血量为hp 第i回合如果用刀砍,怪兽在这回合会直接掉血,没有后续效果 第i回合如果用毒,怪兽在这回合不会掉血, 但是之后每回合都
2300
2023-09-13:用go语言,给定一个整数数组 nums 和一个正整数 k, 找出是否有可能把这个数组分成 k 个非空子集,
2240
2023-05-06:X轴上有一些机器人和工厂
2030
2023-03-18:给定一个长度n的数组,每次可以选择一个数x,让这个数组中所有的x都变成x+1,问你最少的操作次数,使得这个
7510
2023-09-27:用go语言,在一个 n x n 的国际象棋棋盘上,一个骑士从单元格 (row, column) 开始, 并
1770
2023-04-20:有一堆石头,用整数数组 stones 表示 其中 stones[i] 表示第 i 块石头的重量。 每一回合,从中选出任意两块石头,然后将它
3070
相关推荐
2023-01-14:给定一个二维数组map,代表一个餐厅,其中只有0、1两种值 map[i][j] == 0 表示(i,j)位置是空座 map[i][j] =
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验