> 文档中心 > 《六月集训》第一天——数组

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

文章目录

  • 前言
  • 💎一、题目
    • 🏆1.题目描述
    • 🏆2.解题思路
    • 🏆3.代码详解
  • 💎二、题目二
    • 🏆1.题目描述
    • 🏆2.解题思路
    • 🏆3.代码详解
  • 💎三、题目三
    • 🏆1.题目描述
    • 🏆2.解题思路
    • 🏆3.代码详解
  • 💎四、题目四
    • 🏆1.题目描述
    • 🏆2.解题思路
    • 🏆3.代码详解
  • 💎五、星球推荐

前言

        
刷题坚持每一天,以下题目引用自:力扣(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+,在星球里你能够遇到一群志同道合之人,因为都是花钱进来的,你不会看到任何浑水摸鱼的人,每个人都有自己的每月规划,星主每月都会组织算法集训,每天一起刷题,你可以看到别人的解题报告,取其之长,补己之短。