2022-10-21:你将得到一个整数数组 matchsticks ,其中 matchsticks[i] 是第 i 个火柴棒的长度。 你要用 所有的火柴棍 拼成一个正方形。 你 不能折断 任何一根火柴

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022-10-21:你将得到一个整数数组 matchsticks ,其中 matchsticks[i] 是第 i 个火柴棒的长度。 你要用 所有的火柴棍 拼成一个正方形。 你 不能折断 任何一根火柴相关的知识,希望对你有一定的参考价值。

2022-10-21:你将得到一个整数数组 matchsticks ,其中 matchsticks[i] 是第 i 个火柴棒的长度。
你要用 所有的火柴棍 拼成一个正方形。
你 不能折断 任何一根火柴棒,但你可以把它们连在一起,而且每根火柴棒必须 使用一次 。
如果你能拼出正方形,则返回 true ,否则返回 false 。
输入: matchsticks = [1,1,2,2,2]。
输出: true。

答案2022-10-21:

状态压缩的动态规划。
力扣473。各种语言测试,rust运行速度最快,内存占用最低,golang次之,java和c#最慢并且内存占用最高。

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

use std::iter::repeat;
impl Solution 
    pub fn makesquare(matchsticks: Vec<i32>) -> bool 
        let mut matchsticks = matchsticks;
        let mut sum = 0;
        for num in matchsticks.iter() 
            sum += num;
        
        if sum & 3 != 0 
            return false;
        
        let mut dp: Vec<i32> = repeat(0).take(1 << matchsticks.len()).collect();
        return Solution::process(&mut matchsticks, 0, 0, sum >> 2, 4, &mut dp);
    

    fn process(
        arr: &mut Vec<i32>,
        status: i32,
        cur: i32,
        len: i32,
        edges: i32,
        dp: &mut Vec<i32>,
    ) -> bool 
        if dp[status as usize] != 0 
            return dp[status as usize] == 1;
        
        let mut ans = false;
        if edges == 0 
            ans = if status == (1 << arr.len()) - 1 
                true
             else 
                false
            ;
         else 
            let mut i = 0;
            while i < arr.len() as i32 && !ans 
                if ((1 << i) & status) == 0 && cur + arr[i as usize] <= len 
                    if cur + arr[i as usize] == len 
                        ans |= Solution::process(arr, status | (1 << i), 0, len, edges - 1, dp);
                     else 
                        ans |= Solution::process(
                            arr,
                            status | (1 << i),
                            cur + arr[i as usize],
                            len,
                            edges,
                            dp,
                        );
                    
                
                i += 1;
            
        
        dp[status as usize] = if ans  1  else  -1 ;
        return ans;
    


fn main() 
    let matchsticks = vec![1, 1, 2, 2, 2];
    let ans = Solution::makesquare(matchsticks);
    println!("ans = :?", ans);


struct Solution 

执行结果如下:


左神java代码

以上是关于2022-10-21:你将得到一个整数数组 matchsticks ,其中 matchsticks[i] 是第 i 个火柴棒的长度。 你要用 所有的火柴棍 拼成一个正方形。 你 不能折断 任何一根火柴的主要内容,如果未能解决你的问题,请参考以下文章

每日一题分隔数组以得到最大和

将打开的cv mat转换为整数数组

2021-10-07:将有序数组转换为二叉搜索树。给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树

将 numpy 切片转换为 Opencv c++ Mat

来自表示 RGB 图像的浮点数组的初始 CV::MAT

从两个数组中区分额外的元素?