LeetCode数组题

参考链接

代码随想录
讲解视频链接

数组题

1、(两数之和)给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
思考点:

  1. 为什么要把数组下标作为value,值作为key?
    map.containsKey检查是否存在这个key,所以将值作为key
//暴力法
class Solution {public int[] twoSum(int[] nums, int target) {int length = nums.length;int i,j;for (i = 0;i<length;i++){for(j = i+1;j<length;j++){if(nums[i] + nums[j] == target){return new int[]{i, j};}}}return null;}
}
//哈希表法
class Solution {public int[] twoSum(int[] nums, int target) {// 创建一个 HashMap 用于存储值 -> 索引的映射HashMap<Integer,Integer> map = new HashMap<>();//遍历数组for (int i =0;i<nums.length;i++){int complement = target - nums[i]; // 计算目标值需要的另一个数// 检查 Map 中是否已存在所需的数if (map.containsKey(complement)) {return new int[]{map.get(complement), i}; // 返回两个索引}// 当前值存入 Mapmap.put(nums[i], i);}throw new IllegalArgumentException("No solution found");}
}

704、给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。(二分法、有序、无重复元素)
思考点:

  1. 左闭右闭和左开右闭的核心思想应该是区间合法性——在设置循环条件时,是否取等号取决于它能否取到等号,right取值也是同理
    2.说明:当左闭右开时,right要取值为nums.length,如果取nums.length-1,那么只有一个元素的情况,怎么取左闭右开呢?
//左闭右闭写法	
class Solution {public int search(int[] nums, int target) {int left = 0;int right = nums.length - 1;while (left <= right) {int middle = left + (right - left) / 2; // 防止溢出if (nums[middle] > target) {// 在左侧right = middle - 1;} else if (nums[middle] < target) {// 在右侧left = middle + 1;} else {// 找到目标值return middle;}}// 未找到目标值,返回 -1return -1;}
}
//左闭右开
class Solution {public int search(int[] nums, int target) {int left = 0;int right = nums.length;while (left < right) {int middle = left + (right - left) / 2; // 防止溢出if (nums[middle] > target) {// 在左侧right = middle ;} else if (nums[middle] < target) {// 在右侧left = middle + 1;} else {// 找到目标值return middle;}}// 未找到目标值,返回 -1return -1;}
}

27、 移除元素
在这里插入图片描述
1.实际这个问题是考双指针解法定义快慢指针
快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
慢指针:指向更新 新数组下标的位置
在这里插入图片描述

//暴力解法:一个for循环遍历数组元素 ,第二个for循环更新数组
//找到val值位置,将其后元素往前移动一位
// 时间复杂度:O(n^2)
// 空间复杂度:O(1)
class Solution {public int removeElement(int[] nums, int val) {int size = nums.length;for (int i =0;i<size;i++){if(nums[i]==val){for(int j = i +1;j< size;j++){nums[j-1] = nums[j];}i--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位size--; // 此时数组的大小-1}}return size;}
}
//双指针法
class Solution {public int removeElement(int[] nums, int val) {int slow = 0;for (int fast = 0;fast< nums.length; fast++){if( nums[fast] != val){nums[slow] = nums[fast];slow ++;}}return slow;}
}

977、 有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
思考点:
1.数组有序,且最大值出现在数组的两端,可以考虑用双指针法,这里是重点考虑结果集也需要一个指针k指向结果集终止位置,不能依靠fast指针进行填充,因为当出现slow指针数平方大于fast时,fast位置是不变的,会导致结果集同一位置覆盖赋值。
在这里插入图片描述

class Solution {public int[] sortedSquares(int[] nums) {int right = nums.length - 1;int left = 0;int[] result = new int[nums.length];int index = result.length - 1;while (left <= right) {if (nums[left] * nums[left] > nums[right] * nums[right]) {// 正数的相对位置是不变的, 需要调整的是负数平方后的相对位置result[index--] = nums[left] * nums[left];++left;} else {result[index--] = nums[right] * nums[right];--right;}}return result;}
}

209.长度最小的子数组
在这里插入图片描述
思考点:循环索引下标使用的是终止位置,如果使用起始位置其实和暴力解法无异。
在这里插入图片描述

//暴力解法:result设置一个很大的数,防止就算整个序列相加都无法满足条件
class Solution {public int minSubArrayLen(int target, int[] nums) {int result = nums.length + 1;//设置为最大值,防止不存在符合条件的子数组int sum = 0; // 子序列的数值之和int subLength = 0; // 子序列的长度for(int i = 0;i<nums.length;i++){sum =0;for(int j=i;j<nums.length;j++){sum +=nums[j];if(sum>=target){subLength = j-i+1;result = result < subLength? result:subLength;}}}// 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列return result == nums.length + 1 ? 0 : result;}
}
//滑动窗口
class Solution {public int minSubArrayLen(int target, int[] nums) {int result = nums.length + 1;//设置为最大值,防止不存在符合条件的子数组int sum = 0; // 子序列的数值之和int subLength = 0; // 子序列的长度int start = 0;for(int end = 0;end<nums.length;end++){sum += nums[end];while(sum >=target){subLength = end - start + 1;result = result < subLength? result:subLength;sum -= nums[start];start++;}}return result == nums.length + 1 ? 0 : result;}
}

59、螺旋矩阵:给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

思考点:确定循环不变量原则,保持一个区间;每画一条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来。

class Solution {public int[][] generateMatrix(int n) {int[][] matrix = new int[n][n];int loop;int startx = 0; // 起始 x 坐标int starty = 0; // 起始 y 坐标int offset = 1; // 控制每一圈终止位置int count = 1;  // 用于计数自增// 确定圈数if (n % 2 == 1) {loop = n / 2 + 1;} else {loop = n / 2;}while (loop-- > 0) {int i = startx; // 当前层的起始行int j = starty; // 当前层的起始列// 从左到右填充for (; j < n - offset; j++) {matrix[startx][j] = count++;}// 从上到下填充for (; i < n - offset; i++) {matrix[i][j] = count++;}// 从右到左填充for (; j > starty; j--) {matrix[i][j] = count++;}// 从下到上填充for (; i > startx; i--) {matrix[i][j] = count++;}// 更新边界offset++;startx++;starty++;// 如果 n 是奇数,填充中心点if (n % 2 == 1) {matrix[n / 2][n / 2] = count;}}return matrix;}
}

58、区间和:第一行输入为整数数组 Array 的长度 n,接下来 n 行,每行一个整数,表示数组的元素。随后的输入为需要计算总和的区间下标:a,b (b > = a),直至文件结束。输出每个指定区间内元素的总和。
思考点:

  1. 用hasNextInt来循环获取输入值
  2. 前缀和 在涉及计算区间和的问题时非常有用,重复利用计算过的子数组之和,从而降低区间查询需要累加计算的次数。
  3. 要统计 vec[i] 这个数组上的区间和。先做累加,即 p[i] 表示 下标 0 到 i 的 vec[i] 累加 之和。在这里插入图片描述
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int[] vec = new int[n];int[] p = new int[n];int presum = 0;for (int i =0;i<n ;i++){vec[i] = scanner.nextInt();presum += vec[i];p[i] = presum;} while(scanner.hasNextInt()){int a = scanner.nextInt();int b = scanner.nextInt();if (a ==0){System.out.println(p[b]);}else{System.out.println(p[b] - p[a-1]);}}scanner.close();}
}

44、开发商购买土地在这里插入图片描述
思考点:
1.使用区间和的思想,将第一列作为区间和col的第一个元素,第一列加第二列作为col的第二个元素
2.切割也是一个连续的区间和,从第一列到第m列[1,m],col[m-1] - col[i]表示从第i列开始切
3.最后只要记录最小值输出即可

import java.util.Scanner;
public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int m = scanner.nextInt();int[][] matrix = new int[n][m];for (int i = 0;i< n; i++){for(int j = 0;j<m;j++){matrix[i][j]=scanner.nextInt();}}//行区间和int sum =0;int[] row = new int[n];for (int i=0;i<n;i++){for(int j = 0;j<m;j++){sum += matrix[i][j];}row[i] = sum;sum = 0;}//列区间和int[] col = new int[m];for (int j=0;j<m;j++){for(int i = 0;i<n;i++){sum += matrix[i][j];}col[j] = sum;sum = 0;}int[] p = new int[n];for(int i = 0;i<n ;i++){sum += row[i];p[i] = sum;}sum = 0;int[] b = new int[m];for(int j = 0;j<m ;j++){sum += col[j];b[j] = sum;}int result = Integer.MAX_VALUE;//随便设置的一个较大值int distance ;//切割距离//先比行for(int i=0;i<n;i++){distance = Math.abs(p[i] - (p[n - 1] - p[i])); // 两部分绝对差值result = result < distance ? result : distance;}//再比列for(int j=0;j<m;j++){distance = Math.abs(b[j] - (b[m - 1] - b[j])); // 两部分绝对差值result = result < distance ? result : distance;}System.out.println(result);scanner.close();}
}

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

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

相关文章

Unity-Lightmap入门篇

&#xff1a;&#xff1a;这是一个实战文章&#xff0c;并没有知识分享&#xff0c;或理论知识&#xff1b;完全没有 关键字&#xff1a; “lightmap","全局光照”&#xff0c;“light Probe" (会混合一些中英文搜索&#xff0c;或者全英文搜索&#xff09; …

海康VsionMaster学习笔记(学习工具+思路)

一、前言 VisionMaster算法平台集成机器视觉多种算法组件&#xff0c;适用多种应用场景&#xff0c;可快速组合算法&#xff0c;实现对工件或被测物的查找测量与缺陷检测等。VM算法平台依托海康威视在图像领域多年的技术积淀&#xff0c;自带强大的视觉分析工具库&#xff0c;可…

Python双向链表、循环链表、栈

一、双向链表 1.作用 双向链表也叫双面链表。 对于单向链表而言。只能通过头节点或者第一个节点出发&#xff0c;单向的访问后继节点&#xff0c;每个节点只能记录其后继节点的信息&#xff08;位置&#xff09;&#xff0c;不能向前遍历。 所以引入双向链表&#xff0c;双…

【数据结构笔记】习题

渐进分析 【2010-THU-Mid】f(n) O(g(n))&#xff0c;当且仅当g(n) Ω(f(n))。&#xff08;√&#xff09; 【2010-THU-Mid】若f(n) O(n^2)且g(n) O(n)&#xff0c;则以下结论正确的是&#xff08;AD&#xff09; A. f(n) g(n) O(n^2) B. f(n) / g(n) O(n) C. g(n) O(f(…

ES实用面试题

一、es是什么&#xff0c;为什么要用它&#xff1f; ES通常是Elasticsearch的简称&#xff0c;它是一个基于Lucene构建的开源搜索引擎。Elasticsearch以其分布式、高扩展性和实时数据分析能力而闻名&#xff0c;广泛用于全文搜索、日志分析、实时监控等多种场景。 基本特点&am…

适用于学校、医院等低压用电场所的智能安全配电装置

引言 电力&#xff0c;作为一种清洁且高效的能源&#xff0c;极大地促进了现代生活的便捷与舒适。然而&#xff0c;与此同时&#xff0c;因使用不当或维护缺失等问题&#xff0c;漏电、触电事件以及电气火灾频发&#xff0c;对人们的生命安全和财产安全构成了严重威胁&#xf…

智能桥梁安全运行监测系统守护桥梁安全卫士

一、方案背景 桥梁作为交通基础设施中不可或缺的重要组成部分&#xff0c;其安全稳定的运行直接关联到广大人民群众的生命财产安全以及整个社会的稳定与和谐。桥梁不仅是连接两地的通道&#xff0c;更是经济发展和社会进步的重要纽带。为了确保桥梁的安全运行&#xff0c;桥梁安…

【Python爬虫五十个小案例】爬取豆瓣电影Top250

博客主页&#xff1a;小馒头学python 本文专栏: Python爬虫五十个小案例 专栏简介&#xff1a;分享五十个Python爬虫小案例 &#x1fab2;前言 在这篇博客中&#xff0c;我们将学习如何使用Python爬取豆瓣电影Top250的数据。我们将使用requests库来发送HTTP请求&#xff0c;…

Java基础 设计模式——针对实习面试

目录 Java基础 设计模式单例模式工厂模式观察者模式策略模式装饰器模式其他设计模式 Java基础 设计模式 单例模式 单例模式&#xff08;Singleton Pattern&#xff09; 定义&#xff1a;确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问这个实例。适用场景&…

PGSQL学习笔记 -- 从入门到放弃

pgsq学习笔记 一、基本语法&#xff08;一&#xff09;增删改查&#xff08;二&#xff09;PostgreSQL 语法详细介绍及示例 二、数据类型&#xff08;一&#xff09;基本数据类型&#xff08;二&#xff09;复合类型&#xff08;三&#xff09;JSON 和 XML 数据类型&#xff08…

P1198 [JSOI2008] 最大数

P1198 [JSOI2008] 最大数https://www.luogu.com.cn/problem/P1198 牵制芝士&#xff1a;单调队列 思路&#xff1a; 我们的任务是找出一个区间最大值的 因为插入的数与上一次的答案有关 所以它是强制在线的&#xff08;真无语了&#xff09; 我们可以在每次插入时整一个叫…

【C++】入门【一】

本节目标 一、C关键字&#xff08;C98&#xff09; 二、命名空间 三、C的输入输出 四、缺省函数 五、函数重载 六、引用 七、内联函数 八、auto关键字&#xff08;C11&#xff09; 九、范围for&#xff08;C11&#xff09; 十、指针空值nullptr&#xff08;C11&#xff09; 一.…

RabbitMQ7:消息转换器

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

微知-lspci访问到指定的PCIe设备的几种方式?(lspci -s bus;lspci -d devices)

通过bdf号查看 -s &#xff08;bus&#xff09; lspci -s 03:00.0通过vendor id或者device id等设备查看 -d &#xff08;device&#xff09; lspci -d 15b3: #这里是vendor号&#xff0c;所以在前面 lspci -d :1021 #这里是设备号&#xff0c;所以要:在前vendorid和deviceid…

基于Matlab深度学习的CT影像识别系统研究与实现

通过使用AlexNet、GoogLeNet和VGGNet等预训练模型&#xff0c;并结合迁移学习技术&#xff0c;对CT影像进行特征提取和分类。系统在公开数据集上进行了训练和测试&#xff0c;结果表明&#xff0c;该方法能够有效区分COVID-19和非COVID-19的CT影像&#xff0c;具有较高的准确率…

操作系统 锁——针对实习面试

目录 操作系统 锁什么是死锁&#xff1f;说说死锁产生的条件&#xff1f;死锁如何预防&#xff1f;死锁如何避免&#xff1f;银行家算法具体怎么操作&#xff1f;死锁如何解决&#xff1f;死锁会产生什么影响&#xff1f;乐观锁与悲观锁有什么区别&#xff1f; 操作系统 锁 什么…

【NLP 1、人工智能与NLP简介】

人人都不看好你&#xff0c;可偏偏你最争气 —— 24.11.26 一、AI和NLP的基本介绍 1.人工智能发展流程 弱人工智能 ——> 强人工智能 ——> 超人工智能 ① 弱人工智能 人工智能算法只能在限定领域解决特定的问题 eg&#xff1a;特定场景下的文本分类、垂直领域下的对…

C#结构体排序(数组)

结构体排序&#xff08;数组&#xff09; 1 示例1.1 以PointF为例展示效果1.2 运行结果展示 2实际运用2.1 创建结构体2.2 调用示例2.3 运行结果展示 1 示例 1.1 以PointF为例展示效果 private void button1_Click(object sender, EventArgs e) {Random random new Random();…

搭建AI知识库:打造坚实的团队知识堡垒

在信息爆炸的时代&#xff0c;企业面临着知识管理的挑战。团队知识堡垒的构建&#xff0c;即搭建一个高效的AI知识库&#xff0c;对于保护和利用知识资产、提升团队协作效率和创新能力至关重要。本文将探讨搭建AI知识库的重要性、策略以及如何通过这一系统打造坚实的团队知识堡…

(五)Ubuntu22.04+Stable-Diffusion-webui AI绘画 模型转换插件安装及其使用

一、说明 这是秋叶大佬开发的一个模型转换插件&#xff0c;秋叶整合包中自带。如果你的 Stable Diffusion WebUI 中没有这个插件&#xff0c;请使用下面这个地址安装&#xff0c;安装完成之后别忘了重启 WebUI。 模型转换插件 https://github.com/Akegarasu/sd-webui-model-c…