Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2022-07-09:总长度为n的数组中,所有长度为k的子序列里,有多少子序列的和为偶数?

2022-07-09:总长度为n的数组中,所有长度为k的子序列里,有多少子序列的和为偶数?

原创
作者头像
福大大架构师每日一题
发布于 2022-07-09 13:37:53
发布于 2022-07-09 13:37:53
8020
举报

2022-07-09:总长度为n的数组中,所有长度为k的子序列里,有多少子序列的和为偶数?

答案2022-07-09:

方法一:递归,要i还是不要i。

方法二:动态规划。需要两张dp表。

代码用rust编写。代码如下:

代码语言:rust
AI代码解释
复制
use rand::Rng;
fn main() {
    let nn: i32 = 20;
    let vv: i32 = 30;
    let test_time: i32 = 3000;
    println!("测试开始");
    for i in 0..test_time {
        let n = rand::thread_rng().gen_range(0, nn) + 1;
        let k = rand::thread_rng().gen_range(0, n) + 1;
        let mut arr = random_array(n, vv);
        let ans1 = number1(&mut arr, k);
        let ans2 = number2(&mut arr, k);
        if ans1 != ans2 {
            println!("出错了!{}", i);
            println!("ans1 = {}", ans1);
            println!("ans2 = {}", ans2);
            break;
        }
    }
    println!("测试结束");
}

fn number1(arr: &mut Vec<i32>, k: i32) -> i32 {
    if arr.len() == 0 || k < 1 || k > arr.len() as i32 {
        return 0;
    }
    return process1(arr, 0, k, 0);
}

fn process1(arr: &mut Vec<i32>, index: i32, rest: i32, sum: i32) -> i32 {
    if index == arr.len() as i32 {
        return if rest == 0 && (sum & 1) == 0 { 1 } else { 0 };
    } else {
        return process1(arr, index + 1, rest, sum)
            + process1(arr, index + 1, rest - 1, sum + arr[index as usize]);
    }
}

fn number2(arr: &mut Vec<i32>, k: i32) -> i32 {
    if arr.len() == 0 || k < 1 || k > arr.len() as i32 {
        return 0;
    }
    let n = arr.len() as i32;
    // even[i][j] : 在前i个数的范围上(0...i-1),一定选j个数,加起来是偶数的子序列个数
    // odd[i][j]  : 在前i个数的范围上(0...i-1),一定选j个数,加起来是奇数的子序列个数
    let mut even: Vec<Vec<i32>> = vec![];
    let mut odd: Vec<Vec<i32>> = vec![];
    for i in 0..n + 1 {
        even.push(vec![]);
        odd.push(vec![]);
        for _ in 0..k + 1 {
            even[i as usize].push(0);
            odd[i as usize].push(0);
        }
    }
    for i in 0..=n {
        // even[0][0] = 1;
        // even[1][0] = 1;
        // even[2][0] = 1;
        // even[n][0] = 1;
        even[i as usize][0] = 1;
    }
    for i in 1..=n {
        for j in 1..=get_min(i, k) {
            even[i as usize][j as usize] = even[(i - 1) as usize][j as usize];
            odd[i as usize][j as usize] = odd[(i - 1) as usize][j as usize];
            even[i as usize][j as usize] += if (arr[(i - 1) as usize] & 1) == 0 {
                even[(i - 1) as usize][(j - 1) as usize]
            } else {
                odd[(i - 1) as usize][(j - 1) as usize]
            };
            odd[i as usize][j as usize] += if (arr[(i - 1) as usize] & 1) == 0 {
                odd[(i - 1) as usize][(j - 1) as usize]
            } else {
                even[(i - 1) as usize][(j - 1) as usize]
            };
        }
    }
    return even[n as usize][k as usize];
}

fn get_min<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T {
    if a < b {
        a
    } else {
        b
    }
}

// 为了测试
fn random_array(n: i32, v: i32) -> Vec<i32> {
    let mut ans: Vec<i32> = vec![];
    for _i in 0..n {
        ans.push(rand::thread_rng().gen_range(0, v));
    }
    return ans;
}

执行结果如下:

在这里插入图片描述
在这里插入图片描述

左神java代码

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2022-11-03:给定一个数组arr,和一个正数k 如果arr[i] == 0,表示i这里既可以是左括号也可以是右括号, 而且可以涂上1~k每一种颜色 如果
2022-11-03:给定一个数组arr,和一个正数k如果arri == 0,表示i这里既可以是左括号也可以是右括号,而且可以涂上1~k每一种颜色如果arri != 0,表示i这里已经确定是左括号,颜色就是arri的值那么arr整体就可以变成某个括号字符串,并且每个括号字符都带有颜色。返回在括号字符串合法的前提下,有多少种不同的染色方案。不管是排列、还是颜色,括号字符串任何一点不一样,就算不同的染色方案最后的结果%10001,为了方便,我们不处理mod,就管核心思路。2 <= arr长度 <= 50001
福大大架构师每日一题
2022/11/03
3110
2022-11-03:给定一个数组arr,和一个正数k 如果arr[i] == 0,表示i这里既可以是左括号也可以是右括号, 而且可以涂上1~k每一种颜色 如果
2022-08-06:给定一个数组arr,长度为N,arr中所有的值都在1~K范围上, 你可以删除数字,目的是让arr的最长递增子序列长度小于K。 返回至少删除
2022-08-06:给定一个数组arr,长度为N,arr中所有的值都在1~K范围上,
福大大架构师每日一题
2022/08/06
9760
2022-08-06:给定一个数组arr,长度为N,arr中所有的值都在1~K范围上, 你可以删除数字,目的是让arr的最长递增子序列长度小于K。 返回至少删除
2022-06-23:给定一个非负数组,任意选择数字,使累加和最大且为7的倍数,返回最大累加和。 n比较大,10的5次方。 来自美团。3.26笔试。
2022-06-23:给定一个非负数组,任意选择数字,使累加和最大且为7的倍数,返回最大累加和。
福大大架构师每日一题
2022/06/23
3040
2022-06-23:给定一个非负数组,任意选择数字,使累加和最大且为7的倍数,返回最大累加和。 n比较大,10的5次方。 来自美团。3.26笔试。
2022-07-23:给定N件物品,每个物品有重量(w[i])、有价值(v[i]), 只能最多选两件商品,重量不超过bag,返回价值最大能是多少? N <= 1
N <= 10^5, wi <= 10^5, vi <= 10^5, bag <= 10^5。
福大大架构师每日一题
2022/07/23
1510
2022-07-23:给定N件物品,每个物品有重量(w[i])、有价值(v[i]), 只能最多选两件商品,重量不超过bag,返回价值最大能是多少? N <= 1
2023-02-20:小A认为如果在数组中有一个数出现了至少k次, 且这个数是该数组的众数,即出现次数最多的数之一, 那么这个数组被该数所支配, 显然当k比较大
2023-02-20:小A认为如果在数组中有一个数出现了至少k次, 且这个数是该数组的众数,即出现次数最多的数之一, 那么这个数组被该数所支配, 显然当k比较大的时候,有些数组不被任何数所支配。 现在小A拥有一个长度为n的数组,她想知道内部有多少个区间是被某个数支配的。 2 <= k <= n <= 100000, 1 <= 数组的值 <= n。 来自小红书。 答案2023-02-20: 窗口问题。 求总数,求不被支配的数量。 时间复杂度:O(N)。 空间复杂度:O(N)。 代码用rust编写。代码如下:
福大大架构师每日一题
2023/02/20
2350
2023-02-20:小A认为如果在数组中有一个数出现了至少k次, 且这个数是该数组的众数,即出现次数最多的数之一, 那么这个数组被该数所支配, 显然当k比较大
2022-05-27:现在有N条鱼,每条鱼的体积为Ai,从左到右排列,数组arr给出。 每一轮,左边的大鱼一定会吃掉右边比自己小的第一条鱼, 并且每条鱼吃比自己
2022-05-27:现在有N条鱼,每条鱼的体积为Ai,从左到右排列,数组arr给出。
福大大架构师每日一题
2022/05/27
2100
2022-05-27:现在有N条鱼,每条鱼的体积为Ai,从左到右排列,数组arr给出。 每一轮,左边的大鱼一定会吃掉右边比自己小的第一条鱼, 并且每条鱼吃比自己
2022-11-03:给定一个数组arr,和一个正数k如果arr[i] == 0,表示i这里既可以是左括号也可以是右括号,而且可
[左神java代码](https://github.com/algorithmzuo/weekly-problems/blob/main/src/class_2022_08_2_week/Code01_ParenthesesDye.java)
福大大架构师每日一题
2023/02/01
3620
2022-07-05:给定一个数组,想随时查询任何范围上的最大值。 如果只是根据初始数组建立、并且以后没有修改, 那么RMQ方法比线段树方法好实现,时间复杂度O
那么RMQ方法比线段树方法好实现,时间复杂度O(NlogN),额外空间复杂度O(NlogN)。
福大大架构师每日一题
2022/07/05
5230
2022-07-05:给定一个数组,想随时查询任何范围上的最大值。 如果只是根据初始数组建立、并且以后没有修改, 那么RMQ方法比线段树方法好实现,时间复杂度O
2022-05-23:给定一个数组arr,你可以随意挑选其中的数字, 但是你挑选的数中,任何两个数a和b,必须Math.abs(a - b) > 1。 返回你最
let n: i32 = rand::thread_rng().gen_range(0, len) + 1;
福大大架构师每日一题
2022/05/23
5060
2022-05-23:给定一个数组arr,你可以随意挑选其中的数字, 但是你挑选的数中,任何两个数a和b,必须Math.abs(a - b) > 1。 返回你最
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
5550
2023-03-02:给定一个数组arr,长度为n, 任意相邻的两个数里面至少要有一个被选出来,组成子序列,才是合法的! 求所有可能的合法子序列中,最大中位数是
2022-11-09:给定怪兽的血量为hp 第i回合如果用刀砍,怪兽在这回合会直接掉血,没有后续效果 第i回合如果用毒,怪兽在这回合不会掉血, 但是之后每回合都
2022-11-09:给定怪兽的血量为hp第i回合如果用刀砍,怪兽在这回合会直接掉血,没有后续效果第i回合如果用毒,怪兽在这回合不会掉血,但是之后每回合都会掉血,并且所有中毒的后续效果会叠加给定的两个数组cuts、poisons,两个数组等长,长度都是n表示你在n回合内的行动,每一回合的刀砍的效果由cutsi表示每一回合的中毒的效果由poisonsi表示如果你在n个回合内没有直接杀死怪兽,意味着你已经无法有新的行动了但是怪兽如果有中毒效果的话,那么怪兽依然会在hp耗尽的那回合死掉。返回你最快能在多少回合内将
福大大架构师每日一题
2022/11/09
2420
2022-11-09:给定怪兽的血量为hp 第i回合如果用刀砍,怪兽在这回合会直接掉血,没有后续效果 第i回合如果用毒,怪兽在这回合不会掉血, 但是之后每回合都
2023-04-03:如何使用滑动窗口算法和回溯算法解决亚马逊面试题——最长连续相同元素子序列问题?
比如数组arr = { 3, -2, 3, 3, 5, 6, 3, -2 }, k = 3
福大大架构师每日一题
2023/04/03
3010
2023-04-03:如何使用滑动窗口算法和回溯算法解决亚马逊面试题——最长连续相同元素子序列问题?
2022-08-04:输入:去重数组arr,里面的数只包含0~9。limit,一个数字。 返回:要求比limit小的情况下,能够用arr拼出来的最大数字。 来自
2022-08-04:输入:去重数组arr,里面的数只包含0~9。limit,一个数字。
福大大架构师每日一题
2022/08/04
5380
2022-08-04:输入:去重数组arr,里面的数只包含0~9。limit,一个数字。 返回:要求比limit小的情况下,能够用arr拼出来的最大数字。 来自
2022-05-25:最大子段和是 一个经典问题,即对于一个数组找出其和最大的子数组。 现在允许你在求解该问题之前翻转这个数組的连续一段, 如翻转(1,2,3,
如翻转(1,2,3,4,5,6)的第三个到第五个元素組成的子数组得到的是(1,2,5,4,3,6),
福大大架构师每日一题
2022/05/25
4330
2022-05-25:最大子段和是 一个经典问题,即对于一个数组找出其和最大的子数组。 现在允许你在求解该问题之前翻转这个数組的连续一段, 如翻转(1,2,3,
2022-07-01:某公司年会上,大家要玩一食发奖金游戏,一共有n个员工, 每个员工都有建设积分和捣乱积分, 他们需要排成一队,在队伍最前面的一定是老板
该员工奖金 = 排在他前面所有人的建设积分乘积 / 该员工自己的捣乱积分,向下取整,
福大大架构师每日一题
2022/07/01
2930
2022-07-01:某公司年会上,大家要玩一食发奖金游戏,一共有n个员工, 每个员工都有建设积分和捣乱积分, 他们需要排成一队,在队伍最前面的一定是老板
2022-12-20:二狗买了一些小兵玩具,和大胖一起玩, 一共有n个小兵,这n个小兵拍成一列, 第i个小兵战斗力为hi,然后他们两个开始对小兵进行排列, 一共
2022-12-20:二狗买了一些小兵玩具,和大胖一起玩,一共有n个小兵,这n个小兵拍成一列,第i个小兵战斗力为hi,然后他们两个开始对小兵进行排列,一共进行m次操作,二狗每次操作选择一个数k,将前k个小兵战斗力从小到大排列,大胖每次操作选择一个数k,将前k个小兵战斗力从大到小排列,问所有操作结束后,排列顺序什么样,给定一个长度为n的数组arr,表示每个小兵的战斗力,给定一个长度为m的数组op, opi = { k , 0 }, 表示对前k个士兵执行从小到大的操作,opi = { k , 1 }, 表示对前
福大大架构师每日一题
2022/12/20
1790
2022-12-20:二狗买了一些小兵玩具,和大胖一起玩, 一共有n个小兵,这n个小兵拍成一列, 第i个小兵战斗力为hi,然后他们两个开始对小兵进行排列, 一共
2022-06-27:给出一个长度为n的01串,现在请你找到两个区间, 使得这两个区间中,1的个数相等,0的个数也相等, 这两个区间可以相交,但是不可以完全重叠
L0=最左0和最右0的长度,L1=最左1和最右1的长度,求L0和L1的最大值即可。
福大大架构师每日一题
2022/06/27
5371
2022-06-27:给出一个长度为n的01串,现在请你找到两个区间, 使得这两个区间中,1的个数相等,0的个数也相等, 这两个区间可以相交,但是不可以完全重叠
2022-12-06:定义一个概念叫“变序最大和“ “变序最大和“是说一个数组中,每个值都可以减小或者不变, 在必须把整体变成严格升序的情况下,得到的最大累加和
2022-12-06:定义一个概念叫"变序最大和" "变序最大和"是说一个数组中,每个值都可以减小或者不变, 在必须把整体变成严格升序的情况下,得到的最大累加和 比如,1,100,7变成1,6,7时,就有变序最大和为14 比如,5,4,9变成3,4,9时,就有变序最大和为16 比如,1,4,2变成0,1,2时,就有变序最大和为3 给定一个数组arr,其中所有的数字都是>=0的。 求arr所有子数组的变序最大和中,最大的那个并返回。 1 <= arr长度 <= 10^6, 0 <= arri <= 10^6。
福大大架构师每日一题
2022/12/06
6260
2022-12-06:定义一个概念叫“变序最大和“ “变序最大和“是说一个数组中,每个值都可以减小或者不变, 在必须把整体变成严格升序的情况下,得到的最大累加和
2022-12-14:给定一个正数n, 表示从0位置到n-1位置每个位置放着1件衣服 从0位置到n-1位置不仅有衣服,每个位置还摆着1个机器人 给定两个长度为n
2022-12-14:给定一个正数n, 表示从0位置到n-1位置每个位置放着1件衣服
福大大架构师每日一题
2022/12/14
5130
2022-12-14:给定一个正数n, 表示从0位置到n-1位置每个位置放着1件衣服 从0位置到n-1位置不仅有衣服,每个位置还摆着1个机器人 给定两个长度为n
2022-06-08:找到非负数组中拥有“最大或的结果“的最短子数组,返回最短长度。
2022-06-08:找到非负数组中拥有"最大或的结果"的最短子数组,返回最短长度。
福大大架构师每日一题
2022/06/08
1.2K0
2022-06-08:找到非负数组中拥有“最大或的结果“的最短子数组,返回最短长度。
推荐阅读
2022-11-03:给定一个数组arr,和一个正数k 如果arr[i] == 0,表示i这里既可以是左括号也可以是右括号, 而且可以涂上1~k每一种颜色 如果
3110
2022-08-06:给定一个数组arr,长度为N,arr中所有的值都在1~K范围上, 你可以删除数字,目的是让arr的最长递增子序列长度小于K。 返回至少删除
9760
2022-06-23:给定一个非负数组,任意选择数字,使累加和最大且为7的倍数,返回最大累加和。 n比较大,10的5次方。 来自美团。3.26笔试。
3040
2022-07-23:给定N件物品,每个物品有重量(w[i])、有价值(v[i]), 只能最多选两件商品,重量不超过bag,返回价值最大能是多少? N <= 1
1510
2023-02-20:小A认为如果在数组中有一个数出现了至少k次, 且这个数是该数组的众数,即出现次数最多的数之一, 那么这个数组被该数所支配, 显然当k比较大
2350
2022-05-27:现在有N条鱼,每条鱼的体积为Ai,从左到右排列,数组arr给出。 每一轮,左边的大鱼一定会吃掉右边比自己小的第一条鱼, 并且每条鱼吃比自己
2100
2022-11-03:给定一个数组arr,和一个正数k如果arr[i] == 0,表示i这里既可以是左括号也可以是右括号,而且可
3620
2022-07-05:给定一个数组,想随时查询任何范围上的最大值。 如果只是根据初始数组建立、并且以后没有修改, 那么RMQ方法比线段树方法好实现,时间复杂度O
5230
2022-05-23:给定一个数组arr,你可以随意挑选其中的数字, 但是你挑选的数中,任何两个数a和b,必须Math.abs(a - b) > 1。 返回你最
5060
2023-03-02:给定一个数组arr,长度为n, 任意相邻的两个数里面至少要有一个被选出来,组成子序列,才是合法的! 求所有可能的合法子序列中,最大中位数是
5550
2022-11-09:给定怪兽的血量为hp 第i回合如果用刀砍,怪兽在这回合会直接掉血,没有后续效果 第i回合如果用毒,怪兽在这回合不会掉血, 但是之后每回合都
2420
2023-04-03:如何使用滑动窗口算法和回溯算法解决亚马逊面试题——最长连续相同元素子序列问题?
3010
2022-08-04:输入:去重数组arr,里面的数只包含0~9。limit,一个数字。 返回:要求比limit小的情况下,能够用arr拼出来的最大数字。 来自
5380
2022-05-25:最大子段和是 一个经典问题,即对于一个数组找出其和最大的子数组。 现在允许你在求解该问题之前翻转这个数組的连续一段, 如翻转(1,2,3,
4330
2022-07-01:某公司年会上,大家要玩一食发奖金游戏,一共有n个员工, 每个员工都有建设积分和捣乱积分, 他们需要排成一队,在队伍最前面的一定是老板
2930
2022-12-20:二狗买了一些小兵玩具,和大胖一起玩, 一共有n个小兵,这n个小兵拍成一列, 第i个小兵战斗力为hi,然后他们两个开始对小兵进行排列, 一共
1790
2022-06-27:给出一个长度为n的01串,现在请你找到两个区间, 使得这两个区间中,1的个数相等,0的个数也相等, 这两个区间可以相交,但是不可以完全重叠
5371
2022-12-06:定义一个概念叫“变序最大和“ “变序最大和“是说一个数组中,每个值都可以减小或者不变, 在必须把整体变成严格升序的情况下,得到的最大累加和
6260
2022-12-14:给定一个正数n, 表示从0位置到n-1位置每个位置放着1件衣服 从0位置到n-1位置不仅有衣服,每个位置还摆着1个机器人 给定两个长度为n
5130
2022-06-08:找到非负数组中拥有“最大或的结果“的最短子数组,返回最短长度。
1.2K0
相关推荐
2022-11-03:给定一个数组arr,和一个正数k 如果arr[i] == 0,表示i这里既可以是左括号也可以是右括号, 而且可以涂上1~k每一种颜色 如果
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档