首页 > 其他分享 >热题100_20230421

热题100_20230421

时间:2023-04-22 10:34:20浏览次数:36  
标签:pre right 20230421 前缀 nums 数组 100 热题 left

128、最长连续序列

题目说明

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

解题思路1:排序

此法不满足时间复杂度为O(n)

先对数组进行排序,当遇到不连续的数时则重置当前的序列长度为1,遇到与前一位置相同的数时则跳过

解题思路2:哈希

首先对数组的数据进行处理,将其保留到HashSet中同时还起到了对数据去重的效果

然后再对数组进行遍历,用变量cur来记录当前的数值并进入while循环中,反复比对set中是否包含cur + 1并不断更新最终长度max_length。

为了减少遍历的时间,在主循环的遍历中可以判定nums[i - 1]是否包含在set中,如果包含的话说明以当前数为起点的序列肯定是以nums[i - 1]开头的子序列,没有再进入while去set中匹配的意义。

3、无重复字符的最长子串

题目说明

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

解题思路

维护一个窗口,用HashSet记录下窗口中出现的值。如果index = right的值还未出现,窗口可以向右移动;如果出现了则说明左边已经出现过,left慢慢右移并remove掉对应的值

560、和为 K 的子数组

题目说明

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数

输入:nums = [1,1,1], k = 2
输出:2

解题思路:前缀和&哈希

此题需要转换一下思维,易知目标是nums[i ~ j]的区间和是k,那么说明pre[j] - pre[i - 1] = k,即pre[j] - k = pre[i - 1],由此可知满足条件时之前的前缀和就已经出现过了,因此我们可以将前缀和及其出现的次数记录下来,便可获得最终的结果。

首先要对HashSet初始化,因为当pre[j] - k如果等于0的话自然是符合结果的,因此要先往HashSet中加入(0, 1)对。此后不断的加入(pre, map.getOrDefault(pre, 0) + 1),在过程中不断的判断pre - k是否出现过并记录结果

核心代码如下

for (int i = 0; i < nums.length; i++) {
    pre += nums[i];
    if (map.containsKey(pre - k)) {
        res += map.get(pre - k);
    }
    map.put(pre, map.getOrDefault(pre, 0) + 1);
}

238、除自身以外数组的乘积

题目说明

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。

题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。

请不要使用除法,且在 O(n) 时间复杂度内完成此题。

解题思路

因为要求不用除法,整体乘积可以拆分成三个部分:left[i] * nums[i] * right[i] = product,问题转换成求出left[i]与``right[i],而left[i]与right[i]可以分别通过前缀和后缀得到:

每一个数的前缀乘积都是基于此前的上一个前缀乘积 *上一个数,后缀乘积也是同理left[i] = left[i - 1] * nums[i - 1];``right[i] = right[i + 1] * nums[i + 1];汇总即可获得最终结果

如果要在O(1)的空间来获得结果的话,则不用left和right数组,首先将left数组的遍历方式结果直接存储在answer中,然后设定一个变量right,通过其自右向左遍历,不断乘nums[i + 1]并乘到answer[i]中即可

标签:pre,right,20230421,前缀,nums,数组,100,热题,left
From: https://www.cnblogs.com/xccx-0824/p/17342550.html

相关文章

  • 父盒子设置flex:1,子盒子设置height:100%无效的解决方法
    有时候写页面的时候,需要在设置为flex:1的父盒子里面写子盒子,并将子盒子height设置为100%但是可以发现,这样的尝试是无效的,原因是由于父盒子没有设置height属性,导致了子盒子设置百分比失效解决方法:给父盒子设置height:0,此时子盒子再设置height:100%即可生效......
  • mysql generate 1000000 rows with random data
    CREATETABLE`data`(`id`bigint(20)NOTNULLAUTO_INCREMENT,`datetime`timestampNULLDEFAULTCURRENT_TIMESTAMP,`channel`int(11)DEFAULTNULL,`value`floatDEFAULTNULL,......
  • 输出100-200之间所有的质数
    输出100-200之间所有的质数<script>lettotal=0;//计数器for(leti=100;i<200;i++){letnum=true;for(letq=2;q<i;q++){if(i%q==0)/*余数为零,能被整除*/{n......
  • 求100以内偶数的和
    求100以内偶数的和<script> letsum=0 //定义一个变量来存放累加的和 for(leti=0;i<=100;i++){ if(i%2==0){ //对2取余为0即为偶数 sum+=i //进行累加 } } console.log(sum); //控制台打印结果</script>......
  • 求100-999之间的水仙花数
    求100-999之间的水仙花数水仙花数是指一个3位数,它的每个位上的数字的3次幂之和等于它本身。例如:1^3+5^3+3^3=153。<script>for(i=100;i<1000;i++){letc=i%10; /*个位*/letb=parseInt((i/10)%10); ......
  • 计算100的阶乘
    计算100的阶乘<script>letproduct=1;for(letnum=1;num<=100;num++){product*=num; //累乘100次}console.log(product);</script>计算1!+2!+3!+…+20!<script>letsu......
  • 打印出1000-2000年中所有的闰年,并以每行四个数的形式输出
    打印出1000-2000年中所有的闰年,并以每行四个数的形式输出<script>varnum=0; //定义一个计数器for(letyear=1000;year<=2000;year++){if(year%4===0&&year%100!==0||year%400===0){document.......
  • 1000层的Transformer,诞生了!
    卖萌屋今日学术精选大家好,我是卖萌酱。今天下午卖萌屋作者群里一位MILA实验室的大佬在临睡前(蒙特利尔时间凌晨0点半)甩出来一篇论文:大佬表示太困了,肝不动了,于是卖萌酱左手抄起一罐咖啡,右手接过论文就开始肝了,必须第一时间分享给卖萌屋的读者小伙伴们!论文链接:https://arxiv.org/pdf/......
  • 零数科技入选“2022数字中国TOP100”
    4月17日,德本咨询、eNET研究院和互联网周刊联合发布了“2022数字中国TOP100”名单,零数科技凭借在区块链领域的技术创新和优秀的商业落地成果,成功入选“2022数字中国TOP100”。2月27日,中共中央、国务院印发了《数字中国建设整体布局规划》(以下简称《规划》),《规划》指出要夯实数字中国......
  • 洛谷 P1007 独木桥
    题目背景战争已经进入到紧要时间。你是运输小队长,正在率领运输部队向前线运送物资。运输任务像做题一样的无聊。你希望找些刺激,于是命令你的士兵们到前方的一座独木桥上欣赏风景,而你留在桥下欣赏士兵们。士兵们十分愤怒,因为这座独木桥十分狭窄,只能容纳 11 个人通过。假如有 2......