【每日刷题】数组-LC56、LC238、随想录1、LC560

1. LC56 合并区间

题目链接

  1. Arrays.sort先让intervals里的子数组按照子数组的第一个数字值从小到大排列。
  2. 开一个新数组,newInterval,存放合并好的子数组
  3. 让intervals的当前子数组i的第一个数字与newInterval的当前子数组index的最后一个数字比较大小:如果区间没有重叠,则interval的i加入newInterval; 如果重叠,则与newInterval的区间合并
  4. 注意合并时,并不是newInterval[index][1] = intervals[i][1];
    而是newInterval[index][1] = Math.max(newInterval[index][1], intervals[i][1]);
    因为有可能是这种情况:[1,6],[2,4]——这种情况合并还是[1,6]。
    在这里插入图片描述

秒懂力扣区间题目:重叠区间、合并区间、插入区间

class Solution {public int[][] merge(int[][] intervals) {Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]);int[][] newInterval = new int[intervals.length][2];newInterval[0] = intervals[0];int index = 0;for (int i=1; i<intervals.length; i++){if (intervals[i][0] > newInterval[index][1]){index++;newInterval[index] = intervals[i];}else{newInterval[index][1] = Math.max(newInterval[index][1], intervals[i][1]);}}return Arrays.copyOf(newInterval, index+1);}
}

2. LC238除自身以外数组的乘积

题目链接
在这里插入图片描述

class Solution {public int[] productExceptSelf(int[] nums) {int[] left = new int[nums.length];int[] right = new int[nums.length];//leftleft[0] = 1;for (int i=1; i<left.length; i++){left[i] = left[i-1] * nums[i-1];}//rightright[right.length-1] = 1;for (int i=right.length-2; i>=0; i--){right[i] = right[i+1] * nums[i+1];}//合并int[] result = new int[nums.length];for (int i=0; i<nums.length; i++){result[i] = left[i] * right[i];}return result;}
}

3.随想录1、二分查找

题目链接

最重要的是确定左闭右闭区间,所以while条件是<=。因为左闭右闭就是左边区间也包括,右边区间也包括,所以左右区间可以=。如果是开区间,一个区间不包括,一个区间包括,那么两个区间必不能相等。

代码

class Solution {public int search(int[] nums, int target) {int left = 0;int right = nums.length-1;// 避免当 target 小于nums[0] nums[nums.length - 1]时多次循环运算if (target < nums[0] || target > nums[nums.length - 1]) {return -1;}while(left <= right){int mid = (right+left)/2;if (nums[mid] == target){return mid;}else if (nums[mid] > target){right = mid - 1;}else if (nums[mid] < target){left = mid + 1;}}return -1;}
}

4. LC560 和为k的子数组

题目链接

解法一:
暴力算法
易错:在外层循环时,nums[i] == k了之后不要continue,还有继续内循环。因为可能会有这种情况:满足和为k之后,后面出现了1和-1。此时相加和依然为k。

class Solution {public int subarraySum(int[] nums, int k) {int sum = 0;int count = 0;for (int i=0; i<nums.length; i++){sum = nums[i];if (nums[i] == k){count++;}for (int j=i+1; j<nums.length; j++){sum += nums[j];if (sum == k){count++;}}}return count;}
}

解法二:
前缀和

假设数组的前缀和数组为prefixSum,其中prefixSum[i]表示从数组起始位置到第i个位置的元素之和。

对于任意的两个下标i和j(i < j),如果prefixSum[j] - prefixSum[i] = k,即从第i个位置到第j个位置的元素之和等于k,那么说明从第i+1个位置到第j个位置的连续子数组的和为k。

遍历数组,计算每个位置的前缀和,并使用一个哈希表来存储每个前缀和出现的次数。在遍历的过程中,检查是否存在prefixSum[j] - k的前缀和,如果存在,说明从某个位置到当前位置的连续子数组的和为k,将对应的次数累加到结果中。

这样,通过遍历一次数组,统计出和为k的连续子数组的个数,并且时间复杂度为O(n),其中n为数组的长度。

class Solution {public int subarraySum(int[] nums, int k) {int preSum = 0;int count = 0;Map<Integer, Integer> map = new HashMap<>();map.put(0,1); // 初始化前缀和为0的次数为1for (int i=0; i<nums.length; i++){preSum += nums[i];if (map.containsKey(preSum-k)){count += map.get(preSum-k);}if (map.containsKey(preSum)){map.put(preSum, map.get(preSum)+1);}else{map.put(preSum, 1);}}return count;}
}

!!为什么要初始化前缀和?
如果从数组的开始位置到当前位置的子数组的和恰好等于 k,那么这个子数组的前缀和就是 0,即 sum - k 等于 0。因此,需要初始化一个前缀和为 0 的次数为 1,表示从数组的开始位置到当前位置的子数组的和为 k 的情况。如果不初始化,那么这种情况会被漏掉,导致结果不正确。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/719758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARM 架构下国密算法库

目录 前言GmSSL编译环境准备下载 GmSSL 源码编译 GmSSL 源码SM4 对称加密算法SM2 非对称加密算法小结前言 在当前的国际形式下,国替势不可挡。操作系统上,银河麒麟、统信 UOS、鸿蒙 OS 等国产系统开始发力,而 CPU 市场,也是百花齐放,有 龙芯(LoongArch架构)、兆芯(X86…

Intel/国产化无人叉车机器视觉专用控制器

无人叉车和机器视觉是两个独立的技术领域&#xff0c;但它们可以结合使用以实现更高效的物流自动化。无人叉车是一种自动化运输工具&#xff0c;可以在没有人为干预的情况下完成货物的搬运和运输。机器视觉是一种人工智能技术&#xff0c;可以让计算机识别和理解图像或视频中的…

YOLO:实时目标检测的革命

目标检测作为计算机视觉领域的一个核心任务&#xff0c;一直以来都是研究的热点。而YOLO&#xff08;You Only Look Once&#xff09;技术作为其中的杰出代表&#xff0c;以其独特的处理方式和卓越的性能&#xff0c;成为了实时目标检测的标杆。本文将探讨YOLO技术的核心原理、…

FPGA时序约束与分析--建立时间与保持时间

文章目录 前言一、定义二、举例说明2.1 建立时间违规2.2 保持时间违规前言 时序约束的定义–设计者根据实际的系统功能,通过时序约束的方式提出时序要求; FPGA 编译工具根据设计者的时序要求,进行布局布线;编译完成后, FPGA 编译工具还需要针对布局布线的结果,套用特定的…

【C++】每日一题,189 轮转数组

给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,…

搜索回溯算法(DFS)1------递归

目录 简介&#xff1a; 递归问题解题的思路模板 例题1&#xff1a;汉诺塔 例题2&#xff1a;合并两个有序链表 例题3&#xff1a;反转链表 例题4&#xff1a;两两交换链表中的节点 例题5&#xff1a;Pow&#xff08;x,n&#xff09;-快速幂 结语&#xff1a; 简介&…

嵌入式驱动学习第二周——断言机制

前言 这篇博客来聊一聊C/C的断言机制。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程&#xff0c;未来预计四个月将高强度更新本专栏&#xff0c;喜欢的可以关注本博主并订阅本专栏&#xff0c;一起讨论一起学习。现在关注就是老粉啦&#xff01; 目录 前言1. 断言介绍…

贪心 Leetcode 134 加油站

加油站 Leetcode 134 学习记录自代码随想录 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油…

串联所有单词的子串

题目链接 串联所有单词的子串 题目描述 注意点 words[i] 和 s 由小写英文字母组成1 < words.length < 5000可以以 任意顺序 返回答案words中所有字符串长度相同 解答思路 根据滑动窗口哈希表解决本题&#xff0c;哈希表存储words中所有的单词及单词的出现次数&#…

Reactor详解

目录 1、快速上手 介绍 2、响应式编程 2.1. 阻塞是对资源的浪费 2.2. 异步可以解决问题吗&#xff1f; 2.3.1. 可编排性与可读性 2.3.2. 就像装配流水线 2.3.3. 操作符&#xff08;Operators&#xff09; 2.3.4. subscribe() 之前什么都不会发生 2.3.5. 背压 2.3.6. …

p18 线性代数,行阶梯型矩阵

行阶梯型矩阵 行最简型矩阵

steam游戏搬砖,跨国信息差项目,每天1小时收益也很不错

大家好&#xff0c;我是阿阳&#xff01;每天都是一个新的开始&#xff01; 今天看到个Steam游戏搬砖项目&#xff0c;还是跨国国际贸易&#xff0c;感觉很好玩&#xff0c;特来给大家分享。 原理简介 就是把Steam上的游戏装备&#xff0c;搬运到国内网易Buff平台上来卖。目前…

算法沉淀——动态规划之01背包问题(leetcode真题剖析)

算法沉淀——动态规划之01背包问题 01.【模板】01背包02.分割等和子集03.目标和04.最后一块石头的重量 II 01背包问题是一类经典的动态规划问题&#xff0c;通常描述为&#xff1a;有一个固定容量的背包&#xff0c;以及一组物品&#xff0c;每件物品都有重量和价值&#xff0c…

c++基础学习第二天(数组,函数)

提示&#xff1a;c基础学习第二天&#xff08;数组&#xff0c;函数&#xff09; 文章目录 1、数组1.1、 概述1.2、一维数组1.2.1、一维数组定义方式1.2.2、一维数组名称的用途. 1.3、 二维数组1.3.1、二维数组定义方式1.3.2、二维数组数组名的用途 2、函数2.1、概述2.2、函数的…

云计算 2月28号 (linux的磁盘分区)

一 存储管理 主要知识点: 基本分区、逻辑卷LVM、EXT3/4/XFS文件系统、RAID 初识硬盘 机械 HDD 固态 SSD SSD的优势 SSD采用电子存储介质进行数据存储和读取的一种技术&#xff0c;拥有极高的存储性能&#xff0c;被认为是存储技术发展的未来新星。 与传统硬盘相比&#xff0c…

Vue 3 中的 Composition API 详解

Vue.js&#xff0c;作为前端领域流行的框架之一&#xff0c;以其响应式数据绑定和组件化开发赢得了广大开发者的喜爱。随着前端技术的不断发展和项目复杂度的增加&#xff0c;Vue 团队推出了 Vue 3&#xff0c;并引入了 Composition API&#xff0c;以更好地满足复杂应用的需求…

深度伪造,让网络钓鱼更加难以辨别

网络钓鱼一直是安全领域的一个突出话题&#xff0c;尽管这类诈骗形式已经存在了几十年&#xff0c;依旧是欺诈攻击或渗透组织的最有效方法之一。诈骗分子基于社会工程原理&#xff0c;通过邮件、网站以及电话、短信和社交媒体&#xff0c;利用人性&#xff08;如冲动、不满、好…

嵌入式驱动学习第二周——Linux内核打印

前言 这篇博客来聊一聊Linux内核打印。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程&#xff0c;未来预计四个月将高强度更新本专栏&#xff0c;喜欢的可以关注本博主并订阅本专栏&#xff0c;一起讨论一起学习。现在关注就是老粉啦&#xff01; 目录 前言1. dmesg指令…

react diff

react diff算法为降低算法复杂度提出了三大策略&#xff1a; 1.只进行同级比较 2.节点类型比较&#xff0c;不同元素生成不同的fiber树 3.key作为元素的唯一标识 diff算法流程 diff算法需要进行两轮遍历&#xff1a; 第一轮遍历更新的节点。 第二轮遍历没更新的节点。 第一轮…

【LeetCode:225. 用队列实现栈 + 栈 | 队列】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…