《六月集训》第一天——数组


前言

        
刷题坚持每一天,以下题目引用自:力扣(LeetCode)

💎一、题目一

🏆1.题目描述

原题链接:1588. 所有奇数长度子数组的和

        给你一个正整数数组 arr ,请你计算所有可能的奇数长度子数组的和。
        子数组 定义为原数组中的一个连续子序列。
        请你返回 arr 中 所有奇数长度子数组的和 。

示例 1:
输入:arr = [1,4,2,5,3]
输出:58
解释:所有奇数长度子数组和它们的和为:
[1] = 1
[4] = 4
[2] = 2
[5] = 5
[3] = 3
[1,4,2] = 7
[4,2,5] = 11
[2,5,3] = 10
[1,4,2,5,3] = 15
我们将所有值求和得到 1 + 4 + 2 + 5 + 3 + 7 + 11 + 10 + 15 = 58

🏆2.解题思路

🔑思路:

​         枚举连续子序列的开头和结尾,判断是否为奇数子序列,是叠相加,最后返回叠加值。

🏆3.代码详解

int sumOddLengthSubarrays(int* arr, int arrSize){
    int ans = 0;
    for(int i = 0; i < arrSize; ++i){
        int sum = 0;
        for(int j = i; j < arrSize; ++j){
            sum += arr[j]; 
            if((j-i+1)&1) ans += sum; 
        }
    }
    return ans;
}

💎二、题目二

🏆1.题目描述

原题链接:1848. 到目标元素的最小距离

        给你一个整数数组 nums (下标 从 0 开始 计数)以及两个整数 target 和 start ,请你找出一个下标 i ,满足 nums[i] == target 且 abs(i - start) 最小化 。注意:abs(x) 表示 x 的绝对值。
        返回 abs(i - start) 。
        题目数据保证 target 存在于 nums 中。

示例 1:
输入:nums = [1,2,3,4,5], target = 5, start = 3
输出:1
解释:nums[4] = 5 是唯一一个等于 target 的值,所以答案是 abs(4 - 3) = 1 。

🏆2.解题思路

🔑思路:

​         判断数组里的值是否与target相等,相等则取索引istart的绝对值,并取最小绝对值。最后返回最小值。

🏆3.代码详解

#define abs(a) ((a) > (0) ? (a) : (-a))
int getMinDistance(int* nums, int numsSize, int target, int start){
    int min = 10001;
    for(int i = 0; i < numsSize; ++i){
        if(nums[i] == target){
            int a = i-start;
            min = min > abs(a) ? abs(a) : min;
        }
    }
    return min;
}

💎三、题目三

🏆1.题目描述

原题链接: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.解题思路

🔑思路:

​        k > 0时,对数组总长取余。
        k < 0时,先判断j > 0时对数组总长取余,j < 0时先加上数组总长在对总长取余。

🏆3.代码详解

int* decrypt(int* code, int codeSize, int k, int* returnSize){
    *returnSize = codeSize;
    int* ans = (int*)malloc(sizeof(int)*codeSize);
    memset(ans, 0, sizeof(int)*codeSize);
    int num = 0;
    for(int i = 0; i < codeSize; ++i){
        if(k > 0){
            num = 0;
            for(int j = i+1; j <= i+k; ++j){
                num += code[j%codeSize];
            }
        }
        else if(k < 0){
            num = 0;
            for(int j = i-1; j >= i+k; --j){
                int n = j;
                if(n < 0){
                    n = j + codeSize;
                    num += code[n%codeSize]; 
                }
                else num += code[n%codeSize]; 
            }
        }
        ans[i] = num;
    }
    return ans;
}

💎四、题目四

🏆1.题目描述

原题链接:1640. 能否连接形成数组

        给你一个整数数组 arr ,数组中的每个整数 互不相同 。另有一个由整数数组构成的数组 pieces,其中的整数也 互不相同 。请你以 任意顺序 连接 pieces 中的数组以形成 arr 。但是,不允许 对每个数组 pieces[i] 中的整数重新排序。
        如果可以连接 pieces 中的数组形成 arr ,返回 true ;否则,返回 false 。

示例 1:
输入:arr = [15,88], pieces = [[88],[15]]
输出:true
解释:依次连接 [15] 和 [88]

🏆2.解题思路

🔑思路:

​          暴力+hash,具体看代码注释。

🏆3.代码详解

bool canFormArray(int* arr, int arrSize, int** pieces, int piecesSize, int* piecesColSize){
    int hash[101];              
    memset(hash, 0, sizeof(hash));
    for(int i = 0; i < arrSize; ++i)
        hash[arr[i]] = 1;
    for(int i = 0; i < arrSize; ++i){
        for(int j = 0; j < piecesSize; ++j){
            if(hash[pieces[j][0]] == 0) return false;  //piecess行首值在arr里不存在
            if(arr[i] == pieces[j][0]){
                for(int c = 0; c < piecesColSize[j]; ++c){
                    if(hash[pieces[j][c]] == 0) return false; //piecess[j][c]值在arr里不存在
                    if(i == arrSize-1 && piecesColSize[j] > 1) return false; //arr最后一个元素,在piecess里不是行尾元素
                    if(arr[i+c] != pieces[j][c]) return false;//arr下一个元素和piecess某行下一元素不等
                }
            }  
        }
    }
    return true;
}

💎五、星球推荐

        星球链接:英雄算法联盟

星球里有什么?
        【朋友圈】一个极致精准的自律、编程、算法的小圈子。
        【算法集训】以月为单位组织算法集训,每天四题,风雨无阻。
        【排行榜】每天、每周都会有榜单,激励大家不断进步,不断成长。
        【个人规划】每个人都写好自己的规划,也可以查看他人的规划,时刻警醒自己不掉队。
        【打卡挑战】每日一题打卡、每日早起打卡、算法集训打卡、规划完成情况打卡。
在星球里做什么?
        目前星球人数达到500+,在星球里你能够遇到一群志同道合之人,因为都是花钱进来的,你不会看到任何浑水摸鱼的人,每个人都有自己的每月规划,星主每月都会组织算法集训,每天一起刷题,你可以看到别人的解题报告,取其之长,补己之短。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值