首页 > 其他分享 >LeetCode 1652. 拆炸弹

LeetCode 1652. 拆炸弹

时间:2024-06-01 22:28:25浏览次数:19  
标签:code int sum 即子 炸弹 数组 ans 1652 LeetCode

1652. 拆炸弹

你有一个炸弹需要拆除,时间紧迫!你的情报员会给你一个长度为 n 的 循环 数组 code 以及一个密钥 k 。

为了获得正确的密码,你需要替换掉每一个数字。所有数字会 同时 被替换。

  • 如果 k > 0 ,将第 i 个数字用 接下来 k 个数字之和替换。
  • 如果 k < 0 ,将第 i 个数字用 之前 k 个数字之和替换。
  • 如果 k == 0 ,将第 i 个数字用 0 替换。

由于 code 是循环的, code[n-1] 下一个元素是 code[0] ,且 code[0] 前一个元素是 code[n-1] 。

给你 循环 数组 code 和整数密钥 k ,请你返回解密后的结果来拆除炸弹!

示例 1:

输入:code = [5,7,1,4], k = 3
输出:[12,10,16,13]
解释:每个数字都被接下来 3 个数字之和替换。解密后的密码为 [7+1+4, 1+4+5, 4+5+7, 5+7+1]。注意到数组是循环连接的。

示例 2:

输入:code = [1,2,3,4], k = 0
输出:[0,0,0,0]
解释:当 k 为 0 时,所有数字都被 0 替换。

示例 3:

输入:code = [2,4,9,3], k = -2
输出:[12,5,6,13]
解释:解密后的密码为 [3+9, 2+3, 4+2, 9+4] 。注意到数组是循环连接的。如果 k 是负数,那么和为 之前 的数字。

提示:

  • n == code.length
  • 1 <= n <= 100
  • 1 <= code[i] <= 100
  • -(n - 1) <= k <= n - 1

提示 1

As the array is circular, use modulo to find the correct index.


提示 2

The constraints are low enough for a brute-force solution.

相似题型:LeetCode 2515. 到目标字符串的最短距离-CSDN博客

解法1:Brute-Force + 回环

class Solution {
    public int[] decrypt(int[] code, int k) {
        int n = code.length;
        int[] ans = new int[n];
        int sum = 0;
        if (k == 0) {
            return ans;
        } else if (k > 0) {
            for (int i = 0; i < n; i++) {
                sum = 0;
                for (int j = 1; j <= k; j++) {
                    sum += code[(i + j) % n];
                }
                ans[i] = sum;
            }
        } else if (k < 0) {
            k = -k;
            for (int i = 0; i < n; i++) {
                sum = 0;
                for (int j = 1; j <= k; j++) {
                    sum += code[(i - j + n) % n];
                }
                ans[i] = sum;
            }
        }
        return ans;
    }
}

复杂度分析 

  • 时间复杂度:O(n * k),n 是 数组code 的长度, k是输入的密钥的绝对值。
  • 空间复杂度:O(n),n 是 数组 code 的长度。

解法2:滑动窗口 + 回环

如果 k>0,例如 code=[3,1,4,1,5,9], k=3:

计算 ans[0],即子数组 [1,4,1] 的元素和 1+4+1=6。
计算 ans[1],即子数组 [4,1,5] 的元素和,我们可以在 [1,4,1] 的基础上,增加 code[4]=5,减少 code[1]=1,得到 6+5−1=10。
计算 ans[2],即子数组 [1,5,9] 的元素和,我们可以在 [4,1,5] 的基础上,增加 code[5]=9,减少 code[2]=4,得到 10+9−4=15。
计算 ans[3],即子数组 [5,9,3] 的元素和,我们可以在 [1,5,9] 的基础上,增加 code[6 mod 6]=code[0]=3,减少 code[3]=1,得到 15+3−1=17。
计算 ans[4],即子数组 [9,3,1] 的元素和,我们可以在 [5,9,3] 的基础上,增加 code[7mod6]=code[1]=1,减少 code[4]=5,得到 17+1−5=13。
计算 ans[5],即子数组 [3,1,4] 的元素和,我们可以在 [9,3,1] 的基础上,增加 code[8 mod 6]=code[2]=4,减少 code[5]=9,得到 13+4−9=8。
对于 k<0 的情况也同理。注意无论 k>0 还是 k<0,窗口都是在向右移动的,所以确定好第一个窗口的位置,就可以把 k>0和 k<0 两种情况合并起来了。

k>0,第一个窗口的的下标范围为 [1, k+1)。
k<0,第一个窗口的的下标范围为 [n− |k| , n)。
在窗口向右滑动时,设移入窗口的元素下标为 r  mod  n,则移出窗口的元素下标为 (r − |k|)  mod  n。

class Solution {
    public int[] decrypt(int[] code, int k) {
        int n = code.length;
        if (k == 0) {
            return new int[n];
        }
        int sum = 0;
        int[] ans = new int[n];
        // k > 0, 第一个窗口:[1, k + 1); 
        // k < 0, 第一个窗口:[n - |k|, n) 即 [n + k, n)
        int r = k > 0 ? k + 1 : n;
        k = Math.abs(k);
        for (int i = r - k; i < r; i++) {
            sum += code[i];
        }
        for (int l = 0; l < n; l++) {
            ans[l] = sum;
            // 窗口向右滑动时,移除左端点的值,移入新加入的右端点的值
            sum -= code[(r - k) % n];
            sum += code[r % n];
            r++;
        }
        return ans;
    }
}

复杂度分析 

  • 时间复杂度:O(n),n 是 数组code 的长度。
  • 空间复杂度:O(n),n 是 数组 code 的长度。

标签:code,int,sum,即子,炸弹,数组,ans,1652,LeetCode
From: https://blog.csdn.net/m0_56090828/article/details/139379376

相关文章

  • Q3 LeetCode34 在排序数组中找起始位置
    提交错误:数组访问越界1.验证数组越界的语句要放在执行语句的前面,要不然前面报错无法进行到后面部分2.本题使用两次二分查找,左边界找到后,将rigiht指针设置成mid-1,继续查找更左的边界,右边界同理将left设置成mid+13.newint[]{1,1}  新数组创建方式 1classSolution{......
  • (nice!!!)LeetCode 2928. 给小朋友们分糖果 I(枚举、容斥原理)
    2928.给小朋友们分糖果I思路:方法一,三层for循环直接暴力枚举,时间复杂度0(n^3)classSolution{public:intdistributeCandies(intn,intlimit){intans=0;for(inti=0;i<=n&&i<=limit;i++){for(intj=0;j<=n&&j<=limit;j++){......
  • LeetCode 第15题:三数之和的解析
    大家好!本文我们将要探索的是LeetCode的第15题:三数之和。我们的目标是在一片数字的海洋中寻找三颗神奇的珍珠,它们的和为零。准备好了吗?让我们一同踏上这段充满挑战和乐趣的旅程吧!文章目录题目介绍解题思路思路1:暴力法思路2:双指针法思路3:哈希表法思路4:回溯法思......
  • Q2 LeetCode35 搜索插入位置
    //有序查找,无重复元素,要求时间复杂度O(logn)//如果有目标元素则返回位置//如果没有目标元素,最后一次right位置后面就是该插入的位置第一次提交错误认为最后一次mid位置是插入的位置,其实最后一次right位置才是正确的插入位置(升序数组)1classSol......
  • LeetCode 704 二分查找
    第一次提交错误:if-else语句中第二个if前未加else,导致循环出错//二分查找//有序情况下的查找方式,时间复杂度O(logn)//注意左右边界以及停止循环条件left<=right classSolution{publicintsearch(int[]nums,inttarget){......
  • LeetCode---哈希表
    242.有效的字母异位词给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。代码示例: //时间复杂度:O(n)//空间复杂度:O(1)classSolution{public:......
  • LeetCode 第14题:最长公共前缀题目解析(进阶版)
    本文我们来探索LeetCode第14题——最长公共前缀题目解析(进阶版)。文章目录引言题目介绍解题思路思路1:水平扫描法思路2:垂直扫描法思路3:分治法思路4:二分查找法思路5:字典树(Trie)水平扫描法详细解析步骤1:初始化前缀步骤2:逐个比较示例讲解Java代码实现图......
  • LeetCode 1305. All Elements in Two Binary Search Trees
    原题链接在这里:https://leetcode.com/problems/all-elements-in-two-binary-search-trees/description/题目:Giventwobinarysearchtrees root1 and root2,return alistcontainingalltheintegersfrombothtreessortedin ascending order.Example1:Input:......
  • LeetCode 2024/6 每日一题 合集
    2024/6/12928.给小朋友们分糖果I分析枚举所有可能的方案数即可代码实现classSolution{public:intdistributeCandies(intn,intlimit){intans=0;for(inta=0;a<=limit;++a){for(intb=0;b+a<=n&&b<=limi......
  • 【LeetCode算法】第101题:对称二叉树
    目录一、题目描述二、初次解答三、官方解法四、总结一、题目描述二、初次解答1.思路:递归判定左子树和右子树是否对称。用一个新函数sym来递归判定左子树和右子树是否对称。该函数细节:判定当前传入的两个根节点是否为空,若均为空则返回true,若只有其中一个为空则返回fa......