Leetcode刷题的一些记录(Java)

news/2025/1/11 12:06:23/文章来源:https://www.cnblogs.com/xinyangblog/p/18665441

Leetcode刷题

一、理论:

1. 数组:

https://programmercarl.com/数组理论基础.html

C++中二维数组在地址空间上是连续的

像Java是没有指针的,同时也不对程序员暴露其元素的地址,寻址操作完全交给虚拟机。

所以看不到每个元素的地址情况,这里我以Java为例,也做一个实验。

public static void test_arr() {int[][] arr = {{1, 2, 3}, {3, 4, 5}, {6, 7, 8}, {9,9,9}};System.out.println(arr[0]);System.out.println(arr[1]);System.out.println(arr[2]);System.out.println(arr[3]);
}

输出的地址为:

[I@7852e922
[I@4e25154f
[I@70dea4e
[I@5c647e05

这里的数值也是16进制,这不是真正的地址,而是经过处理过后的数值了,我们也可以看出,二维数组的每一行头结点的地址是没有规则的,更谈不上连续。所以Java的二维数组可能是如下排列的方式:

算法通关数组3

2. 哈希表

哈希表能解决什么问题呢,一般哈希表都是用来快速判断一个元素是否出现集合里。

哈希表1

但是要注意,使用数组来做哈希的题目,是因为题目都限制了数值的大小。

而这道题目没有限制数值的大小,就无法使用数组来做哈希表了。

而且如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费。

  • 那有同学可能问了,遇到哈希问题我直接都用set不就得了,用什么数组啊。

直接使用set 不仅占用空间比数组大,而且速度要比数组慢,set把数值映射到key上都要做hash计算的。不要小瞧 这个耗时,在数据量大的情况,差距是很明显的。

二、常见技巧以及注意事项

1. 防止溢出

对数组元素之和进行取余,不要所有的加载一起之后再取余,边加边取余

以及:(2+4)/2=3 = 2+(4-2)/2=3

int mid = left + ((right - left) >> 1);// 防止溢出 等同于(left + right)/2

2. 双指针法

双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。

定义快慢指针

  • 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
  • 慢指针:指向更新 新数组下标的位置

3. 滑动窗口

https://programmercarl.com/0209.长度最小的子数组.html#算法公开课

209.长度最小的子数组 leetcode_209

三、题目:

leetcode100

1. 两数之和

image-20250109210228094

class Solution {public int[] twoSum(int[] nums, int target) {int res[]=new int[2];for (int i = 0; i < nums.length - 1; i++) {for (int j = i + 1; j < nums.length; j++) {if (nums[i] + nums[j] == target) {res[0]=i;res[1]=j;return res;}}}return res;//这里只要有返回就行 null也可以}
}

2. 两数相加

image-20250109210444197

image-20250109210452426

1、代码随想录:数组

704. 二分查找

class Solution {public int search(int[] nums, int target) {if(target<nums[0] || target>nums[nums.length-1]){return -1;}int left = 0,right = nums.length-1;while(left<=right){int mid = left + (right-left)/2;if(nums[mid]==target){return mid;}else if(nums[mid]>target){right = mid-1;}else{left = mid+1;}}return -1;}
}

27. 移除元素

image-20250109220455986

暴力解:

27.移除元素-暴力解法

class Solution {public int removeElement(int[] nums, int val) {int n=nums.length;for(int i = 0; i < n; i++){if(nums[i] == val){for(int j = i+1; j < n; j++){nums[j-1] = nums[j];}i--;//注意这里的更新n--;}}return n;}
}

双指针:

27.移除元素-双指针法

class Solution {public int removeElement(int[] nums, int val) {// 快慢指针int slowIndex = 0;//基本思想:slowIndex  : 已经删除val元素的新数组的下标的位置//fastIndex : 寻找新数组的元素 ,新数组就是不含有目标元素的数组for (int fastIndex = 0; fastIndex < nums.length; fastIndex++) {if (nums[fastIndex] != val) {//如果原数组中的元素不等于val,那么就是属于新数组的元素//复制到新数组中的对应的位置nums[slowIndex] = nums[fastIndex];slowIndex++;}}return slowIndex;}
}

977. 有序数组的平方

image-20250110142741780

暴力解

class Solution {public int[] sortedSquares(int[] nums) {for (int i = 0; i < nums.length; i++) {nums[i] = nums[i] * nums[i];}Arrays.sort(nums);return nums;}
}

双指针

class Solution {public int[] sortedSquares(int[] nums) {int n = nums.length;int[] res = new int[n];int left = 0, right = n - 1, index = n - 1;while (left <= right) {if (nums[left] * nums[left] > nums[right] * nums[right]) {res[index--] = nums[left] * nums[left];++left;} else {res[index--] = nums[right] * nums[right];--right;}}return res;}
}

209. 长度最小的子数组

image-20250110163455186

暴力解

class Solution {public int minSubArrayLen(int target, int[] nums) {int sum = 0;int res = Integer.MAX_VALUE;for (int i = 0; i < nums.length; i++) {sum=0;for (int j = i; j < nums.length; j++) {sum += nums[j];if (sum >= target) {res = (j - i + 1) < res ? (j - i + 1) : res;break;}}}return res == Integer.MAX_VALUE ? 0 : res;//如果res没有被赋值,说明数组元素的综合没有超过target}
}

滑动窗口:

209.长度最小的子数组

leetcode_209
class Solution {public int minSubArrayLen(int target, int[] nums) {int slow = 0,sum=0,res=Integer.MAX_VALUE;//slow 滑动窗口起始位置for(int fast = 0;fast<nums.length;fast++){sum+=nums[fast];while(sum>=target){// 注意这里使用while,每次更新 i(起始位置),并不断比较子序列是否符合条件res=Math.min(res,fast-slow+1);sum-=nums[slow++];// 这里体现出滑动窗口的精髓之处,不断变更i(子序列的起始位置).可以发现滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)暴力解法降为O(n)。}}return res==Integer.MAX_VALUE?0:res;}
}

59. 螺旋矩阵 II

image-20250110180420532 img
class Solution {public int[][] generateMatrix(int n) {int[][] matrix = new int[n][n];int loop = 0, left = 0, right = n - 1, top = 0, bottom = n - 1, cnt = 1;while (loop <= n / 2) {for (int i = left; i <= right - 1; i++) {matrix[top][i] = cnt++;}for (int i = top; i <= bottom - 1; i++) {matrix[i][right] = cnt++;}for (int i = right; i >= left+1; i--) {matrix[bottom][i] = cnt++;}for (int i = bottom; i >= top+1; i--) {matrix[i][left] = cnt++;}loop++;left++;right--;bottom--;top++;}if(n%2!=0){matrix[n/2][n/2] = cnt;}return matrix;}
}

3. 代码随想录:哈希表

242. 有效的字母异位词

image-20250110182651980

class Solution {public boolean isAnagram(String s, String t) {if (s.length() != t.length())return false;int[] record = new int[26];for (int i = 0; i < s.length(); i++) {record[s.charAt(i) - 'a']++;}for (int i = 0; i < t.length(); i++) {record[t.charAt(i) - 'a']--;}for (int count : record) {if (count != 0) { // record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。return false;}}return true;}
}

349. 两个数组的交集

image-20250110184748989
class Solution {public int[] intersection(int[] nums1, int[] nums2) {int []hash1 = new int[1001];int []hash2 = new int[1001];for (int i = 0; i < nums1.length; i++) {hash1[nums1[i]]++;}for (int i = 0; i < nums2.length; i++) {hash2[nums2[i]]++;}ArrayList<Integer> resTmp = new ArrayList<>();//ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。for (int i = 0; i < hash1.length; i++) {if (hash1[i] >0 &&  hash2[i]>0) {//出现一次或者多次的,都记录其中了resTmp.add(i);}}int[] res = new int[resTmp.size()];//返回的是正常的数组,不是ArrayList类型for (int i = 0; i < res.length; i++) {res[i] = resTmp.get(i);}return res;}
}

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

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

相关文章

招行面试:亿级秒杀,超卖问题+少卖问题,如何解决?(图解+秒懂+史上最全)

本文原文链接 文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 …

OpenCL入门笔记

1、概述 1.1、OpenCL标准 OpenCL(Open Computing Language)是一个开放标准的并行编程框架,它允许开发者在异构系统上利用各种计算设备(例如CPU、GPU、FPGA等)来加速任务,目前已被广泛应用于视频处理、医学成像、机器学习等领域。 OpenCL最初由苹果公司提出,并在与AMD、IBM…

京东自动化上传图片

背景:客户目前每天需花费2小时在京东平台上传商品图片,该过程涉及手动输入SkuId并上传相应图片。由于商品数量庞大,这一操作不仅繁琐,而且容易导致错误匹配的情况。期望:通过引入自动化工具实现京东商品图片更新的自动化处理,提高操作准确性,预计每日为客户节省2小时的人…

46. bootstrap

1. bootstrap介绍中文网:https://bootcss.com/bootstrap需要导入两个文件:上方文件夹里的css文件和JavaScript文件 由于bootstrap v3依赖jQuery,因此还要导入jQuery文件bootstrap的核心是通过class直接使用类 2. 全局css样式 Bootstrap 将设置全局的 CSS 样式。HTML 的基本元…

虽然你已经更新了,但是pip依然提示[notice] A new release of pip is available

虽然你已经更新了pip的版本,但是pip依然提示[notice] A new release of pip is available,而且导致安装的时候出错。其实是在 pip 对应的文件夹中有多个.dist-info文件。 参照你的python位置,如:"..\PythonXX\Lib\site-packages\pip-{老版本}.dist-info"留一个就…

02 Java基础

注释 定义:写代码时,随着项目变复杂要用到注释,注释是给写代码的人看的,且写注释是好习惯。 类型:单行注释 // 多行注释 /* 注释 */ 文档注释 /**注释 */标识符 关键字:Java 所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符 标识符注意点:…

五子棋软件Gomoku

大家好!Gomoku是我用VB6开发的五子棋软件,适合于打谱,棋盘截图等。(不支持人机对弈)每走一步棋,右侧的列表框显示相应的坐标,鼠标点击右侧列表可以悔棋。

循环语句小结

三种循环语句特点及比较一、for循环语句 for语句最常用的格式为: for (循环变量赋初值;循环条件;循环变量增值) 语句; 注: “语句;”就是循环体,可以是一个简单的语句,也可以是一个用“{}”括起来的复合语句。 它的执行过程如图示:for语句要素与流程环节对应图:二、w…

【建议收藏】工程师必须要知道的20个PCB设计规则

今天给大家分享:工程师必须知道的 12 个PCB设计原则 1、控制走线长度 控制走线的长度,顾名思义,就是短走线的规则,PCB 设计时应控制走线长度尽可能短,以免因走线过长而引入不必要的干扰。 特别是对于一些重要的信号线,例如时钟信号走线,一定要将其振荡器放置得离器件非常…

创建maven多模块项目

创建Maven父模块创建项目项目目录结构、pom.xml文件在pom.xml文件中配置打包类型为pom创建子模块common选中项目,鼠标右键,依次选择 “New→Module”项目pom.xml文件,可以看到parent标签里的内容,表示父模块的信息。在pom.xml文件中配置打包类型为jar(非必须,可加可不加)…

《操作系统真相还原》实验记录2.4——内存管理系统

本文章实现内容如下: 1. 位图的建立; 2. 内存池初始化; 3. 分配内存初试;一、位图 bitmap 及其函数的实现 1.1 位图简介位图,也就是bitmap,广泛用于资源管理,是一种管理资源的方式、手段。“资源”包括很多,比如内存或硬盘,对于此类大容量资源的管理一般都会采用位图…

信息安全数学基础-期末(第八章)

群 定义 半群的定义:设S是一个具有结合法的非空集合.如果S中有一个元素e;使得对S中所有元素a,都有 ea=ae=a. 单位元的定义: 性质:设 S是一个有单位元的半群, 则对 S 中的任意可逆元 a, 其逆元 a 是唯的 群的定义: 子群 定义: 同态和同构 定义: 单射、满射、双射: 单射确…