数组篇-代码随想录

news/2025/1/11 4:04:22/文章来源:https://www.cnblogs.com/tcl-study/p/18522096

数组篇

跳-二分查找-704-力扣

class Solution {public int search(int[] nums, int target) {if (nums == null || nums.length == 0) return -1;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-力扣

class Solution {//方案二:双指针法public int removeElement(int[] nums, int val) {int left = 0;int right = nums.length-1;int counts = 0;while(left<=right){while (left<=right && nums[right]==val){right--;}while (left<=right && nums[left]!=val){left++;}if(left<right){nums[left]=nums[right];nums[right]=val;}}return right+1;}// // 方案一: 正常遍历// public int removeElement(int[] nums, int val) {//     int counts = nums.length;//     for(int i=nums.length-1; i>=0; i--) {//         if (nums[i] == val) {//             counts--;//             for(int j=i+1; j<nums.length; j++) {//                 nums[j-1] = nums[j];//             }//             nums[nums.length-1] = val;//         }//     }//     return counts;// }
}

做-有序数组的平方-977-力扣

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。示例 1:输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
示例 2:输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]
// 双指针法,方法一
class Solution {public int[] sortedSquares(int[] nums) {int n = nums.length;int[] ant = new int[n];for (int i=0,j=n-1,pos=n-1; i<=j;) {if (nums[i]*nums[i] > nums[j]*nums[j]) {ant[pos] = nums[i]*nums[i];i++;} else {ant[pos] = nums[j] * nums[j];j--;}pos--;}return ant;}
}
方法二:
利用数组中元素是升序的这一条件:即如果数组中元素有负有正
-4  -2  1  3*l  *r
左指针向左,右指针向右遍历,然后左右指针进行比较
//方法三:将数组里面的元素平方之后,再进行快排算法class Solution {public int[] sortedSquares(int[] nums) {int len = nums.length;for (int i=0; i<len; i++) {nums[i] = nums[i]*nums[i];}quickSort(nums, 0, len-1);return nums;}private void quickSort(int[] nums, int low, int high) {int left, right, temp, t;if (low >= high){return;}// 左右指针left = low;right = high;temp = nums[low];    //temp就是基准位while (left < right) {//先看右边,依次往左递减while (nums[right]>=temp && left<right) {right--;}//再看左边,依次往右递增while (nums[left]<=temp && left<right) {left++;}//如果满足条件则交换if (left < right) {t = nums[right];nums[right] = nums[left];nums[left] = t;}}//最后将基准为与left和right相等位置的数字交换nums[low] = nums[left];nums[left] = temp;//递归调用左半数组quickSort(nums, low, right-1);//递归调用右半数组quickSort(nums, right+1, high);}}

思考-长度最小的子数组-209-力扣

给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 
子数组[numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。示例 1:输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:输入:target = 4, nums = [1,4,4]
输出:1
示例 3:输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

滑动窗口(就使用这个)

class Solution {public int minSubArrayLen(int target, int[] nums) {int len = nums.length;int count = len + 1;int left = 0;long sum = 0;for (int right=0; right<len; right++) {sum += nums[right];while (sum >= target) {count = Math.min(count, right-left+1);sum -= nums[left++];}}return count==len+1 ? 0 : count;}
}

我自己写的(有问题)

代码估计没有错误,但是时间超出了限制 O(n^2)级别了

class Solution {public int minSubArrayLen(int target, int[] nums) {int len = nums.length;int count = len+1;for(int left=len-1; left>=0; left--) {int sum = 0;for(int right=left; right<len; right++) {sum+=nums[right];if(right-left+1<count && sum>=target){count = right - left + 1;break;}}}return count==len+1 ? 0 : count;}
}

思考-螺旋矩阵||-59-力扣

题目:给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。示例 1:输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:输入:n = 1
输出:[[1]]
class Solution {public int[][] generateMatrix(int n) {int[][] nums = new int[n][n];int startX = 0, startY = 0; // 每一圈的起始点int offset = 1;int count = 1;  // 矩阵中需要填写的数字int loop = 1; // 记录当前的圈数int i, j; // j 代表列, i 代表行;while (loop <= n/2) {// 顶部// 左闭右开,所以判断循环结束时, j 不能等于 n - offsetfor (j=startY; j<n-offset; j++) {nums[startX][j] = count++;}// 右列// 左闭右开,所以判断循环结束时, i 不能等于 n - offsetfor (i=startX; i<n-offset; i++) {nums[i][j] = count++;}// 底部// 左闭右开,所以判断循环结束时, j != startYfor (; j>startY; j--) {nums[i][j] = count++;}// 左列// 左闭右开,所以判断循环结束时, i != startXfor (; i>startX; i--) {nums[i][j] = count++;}startX++;startY++;offset++;loop++;}if (n%2 == 1) {nums[startX][startY] = count;}return nums;}
}

小结:这道题要注意的地方,就在于整个逻辑。

​ 记录当前的圈数、记录每圈开始的起始位置、记录每圈的偏移量

跳-区间和-58-卡码网

题目描述
给定一个整数数组 Array,请计算该数组在每个指定区间内元素的总和。
输入描述
第一行输入为整数数组 Array 的长度 n,接下来 n 行,每行一个整数,表示数组的元素。随后的输入为需要计算总和的区间下标:a,b (b > = a),直至文件结束。
输出描述
输出每个指定区间内元素的总和。
输入示例
5
1
2
3
4
5
0 1
1 3
输出示例
3
9

代码

import java.util.Scanner;public class mm {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();int sum = 0;if (a == 0) {sum = p[b];} else {sum = p[b] -p[a-1];}System.out.println(sum);}scanner.close();}
}

思路

第一个位置:前一个和

第二个位置:前二个和

.........

第n个位置:前n个和

跳-开发商购买土地-44-卡码网

题目描述
在一个城市区域内,被划分成了n * m个连续的区块,每个区块都拥有不同的权值,代表着其土地价值。目前,有两家开发公司,A 公司和 B 公司,希望购买这个城市区域的土地。 现在,需要将这个城市区域的所有区块分配给 A 公司和 B 公司。然而,由于城市规划的限制,只允许将区域按横向或纵向划分成两个子区域,而且每个子区域都必须包含一个或多个区块。 为了确保公平竞争,你需要找到一种分配方式,使得 A 公司和 B 公司各自的子区域内的土地总价值之差最小。 注意:区块不可再分。输入描述
第一行输入两个正整数,代表 n 和 m。 接下来的 n 行,每行输出 m 个正整数。输出描述
请输出一个整数,代表两个子区域内土地总价值之间的最小差距。

解题思路

和我写的代码一样,用的还是前缀和的思想。

我的代码

import java.util.Scanner;
import java.lang.Math.*;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int m = scanner.nextInt();int[] h = new int[n];int[] c = new int[m];int[][] p = new int[n][m];int sum = 0;int SUM = 0;for (int i=0; i<n; i++) {sum = 0;for (int j=0; j<m; j++) {p[i][j] = scanner.nextInt();sum += p[i][j];SUM += p[i][j];}if (i != 0) {h[i] = h[i-1] + sum;} else {h[i] = sum;}}for (int j=0; j<m; j++) {sum = 0;for (int i=0; i<n; i++) {sum += p[i][j];}if (j != 0) {c[j] = c[j-1] + sum;} else {c[j] = sum;}}for (int i=0; i<n-1; i++) {if (Math.abs(h[n-1]-2*h[i]) < SUM) {SUM = Math.abs(h[n-1]-2*h[i]);}}for (int j=0; j<m-1; j++) {if (Math.abs(c[m-1]-2*c[j]) < SUM) {SUM = Math.abs(c[m-1]-2*c[j]);}}System.out.println(SUM);}
}

总结

image-20241102155406255

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

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

相关文章

闲话 11.2

杂项乱写 11.2也是打上搜了。小木棍 曾经在题库上做过,数据水就过了,交洛谷发现只有 87pts。 《剪 枝 盛 宴》钦定长度:最小肯定是最长的那根木棍,最长肯定是所有木棍的总和,并且这个长度一定只能是总和的因数。 选择顺序:如果选一个长的合法,那么选若干个和相同的短的一…

Nuxt.js 应用中的 nitro:config 事件钩子详解

title: Nuxt.js 应用中的 nitro:config 事件钩子详解 date: 2024/11/2 updated: 2024/11/2 author: cmdragon excerpt: nitro:config 是 Nuxt 3 中的一个生命周期钩子,允许开发者在初始化 Nitro 之前自定义 Nitro 的配置。Nitro 是 Nuxt 3 的服务器引擎,负责处理请求、渲染…

源鲁杯2024[Round 3] CheckImg

新思路:十六进制错位恢复 新知识:DNA编码 下载文件,是一张图片,010、属性、pngcheck都没有发现信息,用stegslove打开查看, 在red0通道发现图片下面有明显的隐写,后面的green0有提示(这图片真的好大,一整个屏幕看不到完整的)Green0通道的整句话应该是attention to det…

第三十一讲:为什么还有kill不掉的语句?

第三十一讲:为什么还有kill不掉的语句? 简概依旧是平平无奇的开篇 ​ 在 MySQL 中有两个 kill 命令: ​ 一个是 kill query + 线程 id,表示终止这个线程中正在执行的语句; ​ 一个是 kill connection + 线程 id,这里 connection 可缺省,表示断开这个线程的连接,当然如果…

代码随想录一刷day6 (链表day2)(链表完结)

24. 两两交换链表中的节点 分三步走; 1.创建dummyhead 2.三个指针 cur t1 t2 3. cur->next=t2; t1->next=t2->next; t2->t1->next; 最后让cur=t1; 注意最后返回的是dummyhead-》next 而不是head;注意最后delete dummyhead19.删除链表的倒数第N个…

代码随想录一刷day7 (链表day2)

24. 两两交换链表中的节点 分三步走; 1.创建dummyhead 2.三个指针 cur t1 t2 3. cur->next=t2; t1->next=t2->next; t2->t1->next; 最后让cur=t1; 注意最后返回的是dummyhead-》next 而不是head;注意最后delete dummyhead19.删除链表的倒数第N个…

【触想智能】工业平板电脑在智能教育设备上的应用优势分析

随着科技的快速发展,智能教育设备成为现代教育领域的新宠。其中,工业平板电脑作为一种重要的智能教育设备,正逐渐在教育领域得到广泛应用。工业平板电脑在智能教育设备上的应用具有以下几个优势。1、工业平板电脑具备便携性。相比传统的教学设备,如电视、投影仪等,工业平板…

【AIGC人脸生成的后门攻击】 Is It Possible to Backdoor Face Forgery Detection with Natural Triggers?

[!CAUTION] 本篇论文主要是关于AIGC生成人脸的后门攻击,与换脸技术的后门攻击有差异,因此本篇文章主要研究 trigger 的生成部分,后面的实验部分不加以研究。一、研究动机 ​ 目前的后门攻击模型还比较简单,是基于数字像素上的操作,例如增加噪声或者像素补丁,这些攻击已经…

cocolis

cocolis以下是博客签名,正文无关本文来自博客园,作者:Jijidawang,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/18521668版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。 看完如果觉得有用请点个赞吧…

[理论学习] CNN学习笔记简陋版

写在前面 参考: https://www.cnblogs.com/boostwei/p/15195643.html https://www.youtube.com/watch?v=pj9-rr1wDhMCNN做了什么 CNN的出现主要解决图像处理的两大难题: 1.图像处理的数据量过大以致处理成本昂贵且效率低 2.图象在数字化的过程中很难保证原有的特征CNN结构输入…

你还用ES存请求日志?ClickHouse+Vector打造最强Grafana日志分析看板

为什么要做NGINX日志分析看板 Grafana官网的dashboards有NGINX日志采集到ES数据源的展示看板,也有采集到LOKI数据源的展示看板,唯独没有采集到ClickHouse数据源的展示看板。所以这个轮子是必须要造的。 为什么不使用ES存储 ElasticSearch是全文检索引擎的文档数据库,对于业务…

伙伴系统和slab分配器

伙伴系统(buddy system) 当一个请求需要分配m个物理页,buddy system会寻找一个有\(2^n\)页的块(\(2^n-1 < m < 2^n\))分配给他。我们使用一个空闲链表数组实现buddy system,其中a[i]代表块大小为\(2^i个页\)(每页为4kb) 假设我们要分配15kb内存,根据buddy system,我们…