常州培训做网站哪些软件可以做网页
news/
2025/10/3 13:59:22/
文章来源:
常州培训做网站,哪些软件可以做网页,微信官方网站是多少钱,wordpress撰写设置文章目录 1.二分查找1.1题目1.2思路#xff08;核心#xff1a;区间的定义#xff09;1.3左闭右闭1.4左闭右开1.5总结 2.移除元素2.1题目2.1思路2.2.1暴力解法2.2.2双指针法 23总结 3.有序数组的平方3.1题目3.2思路3.2.1暴力解法3.2.2双指针法 4.长度最小的子数组4.1题目4.2… 文章目录 1.二分查找1.1题目1.2思路核心区间的定义1.3左闭右闭1.4左闭右开1.5总结 2.移除元素2.1题目2.1思路2.2.1暴力解法2.2.2双指针法 23总结 3.有序数组的平方3.1题目3.2思路3.2.1暴力解法3.2.2双指针法 4.长度最小的子数组4.1题目4.2思路4.2.1暴力解法4.2.2滑动窗口双指针升级 5.螺旋矩阵25.1题目5.2思路 1.二分查找
1.1题目
704.二分查找—力扣题目链接
题目给定一个 n 个元素有序的升序整型数组 nums 和一个目标值 target 写一个函数搜索 nums 中的 target如果目标值存在返回下标否则返回 -1。示例一
输入: nums [-1,0,3,5,9,12], target 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4示例二
输入: nums [-1,0,3,5,9,12], target 2
输出: -1
解释: 2 不存在 nums 中因此返回 -11.2思路核心区间的定义
题目的前提是数组为有序数组同时题目还强调 数组中无重复元素因为一旦有重复元素使用二分查找法返回的元素下标可能不是唯一的这些都是使用二分法的前提条件当大家看到题目描述满足如上条件的时候可要想一想是不是可以用二分法了。
1.3左闭右闭
定义target在 [left, right] 区间所以有如下两点
while (left right) 要使用 因为left right是有意义的所以使用 if (nums[middle] target) right 要赋值为 middle - 1因为当前这个nums[middle]一定不是target那么接下来要查找的左区间结束下标位置就是 middle - 1下面举例演示在一组有序不重复数组中分别查找数据2、数据6的过程 /*** Description 二分查找第一种写法左闭右闭* Param* Return 下标值int*/public int binarySearch1(int[] arr,int target){int left0;int rightarr.length-1;while(leftright){/*** 写法一可能出现溢出情况* int mid(leftright)/2;* 写法二* int midleft(right-left)/2;*///写法三右移运算符 代替 除号int midleft((right-left)1);if(arr[mid]target){ //在左区间即[left,mid-1]rightmid-1;}else if(arr[mid]target){ //在右区间即[mid1,right]leftmid1;}else{return mid;}}return -1;}时间复杂度O(log n)空间复杂度O(1)
1.4左闭右开
如果说定义 target 是在一个在左闭右开的区间里也就是[left, right) 那么二分法的边界处理方式则截然不同。
while (left right)这里使用 ,因为left right在区间[left, right)是没有意义的if (nums[middle] target) right 更新为 middle因为当前nums[middle]大于target去左区间继续寻找而寻找区间是左闭右开区间所以right更新为middle即下一个查询区间不会去比较nums[middle] 代码示例 /*** Description 二分查找第一种写法左闭右闭* Param* Return 下标值int*/public int binarySearch2(int[] arr,int target){int left0;int rightarr.length;while(leftright){int midleft((right-left)1);if(arr[mid]target){ //在左区间即[left,mid-1)rightmid;}else if(arr[mid]target){ //在右区间即[mid1,righ)leftmid1;}else{return mid;}}return -1;}时间复杂度O(log n)空间复杂度O(1)
1.5总结
使用二分查找的两个前提 数组有序数组元素唯一不重复 二分查找的两个写法区分
左闭右闭左闭右开right初始取值rightarr.length-1rightarr.length循环条件while(leftright)while(leftright)left更新值到右区间查找leftmid1leftmid1right更新值到左区间查找rightmid-1rightmid
2.移除元素
27.移除元素_力扣链接
2.1题目
给你一个数组 nums 和一个值 val你需要 原地 移除所有数值等于 val 的元素并返回移除后数组的新长度。
不要使用额外的数组空间你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例1
输入nums [3,2,2,3], val 3
输出2, nums [2,2]
解释函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如函数返回的新长度为 2 而 nums [2,2,3,3] 或 nums [2,2,0,0]也会被视作正确答案。示例2
输入nums [0,1,2,2,3,0,4,2], val 2
输出5, nums [0,1,3,0,4]
解释函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。2.1思路
2.2.1暴力解法
两层for循环一个for循环遍历数组元素 第二个for循环更新数组。 class Solution {public int removeElement(int[] nums, int val) {int total0;for(int i0;inums.length;i){if(nums[i]val){//发现该val值将该位置后面的数组都往前移动一位for(int ji1;jnums.length;j){nums[j-1]nums[j];}i--;//结束内层循环后执行i命令但是原来的nums[i1]位置上的元素已经被覆盖为nums[i2]total;}}return nums.length-total;}
}2.2.2双指针法
定义通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。 快指针寻找新数组的元素 新数组就是不含有目标元素的数组慢指针指向更新 新数组下标的位置 演示 代码
class Solution {public int removeElement(int[] nums, int val) {int total0;//快慢指针int slowIndex0;for(int fastIndex0;fastIndexnums.length;fastIndex){if(nums[fastIndex]!val){//将快指针的值赋予慢指针的值并同时向前移动nums[slowIndex]nums[fastIndex];slowIndex;}else{//找到该值暂停慢指针total;}}return nums.length-total;}
}注意这些实现方法并没有改变元素的相对位置 时间复杂度O(n)空间复杂度O(1)
23总结
双指针法快慢指针法在数组和链表的操作中是非常常见的很多考察数组、链表、字符串等操作的面试题都使用双指针法。
3.有序数组的平方
3.1题目
977.有序数组的平方——力扣题目链接
给你一个按 非递减顺序 排序的整数数组 nums返回 每个数字的平方 组成的新数组要求也按 非递减顺序 排序。
示例一
输入nums [-4,-1,0,3,10]
输出[0,1,9,16,100]
解释平方后数组变为 [16,1,0,9,100]
排序后数组变为 [0,1,9,16,100]示例二
输入nums [-7,-3,2,3,11]
输出[4,9,9,49,121]3.2思路
3.2.1暴力解法
遍历数组将数组的每个元素平方接着排个序即可
3.2.2双指针法 原数组是 有序 的就是说数字0的左区间平方后的元素越左边越大、右区间平方后的元素越右边越大 由此可以得出平方后的数组最大值不是在原数组最左边就是最右边 考虑双指针法了i指向起始位置j指向终止位置 示意图
class Solution {public int[] sortedSquares(int[] nums) {//思路原数组有序那最大值不是在最左边就是在最右边//双指针分别指向最左边和最右边并新建一个数组将最大值移向数组的最后面int lennums.length;int jnums.length-1;int knums.length-1;int[] arrnew int[len];for(int i0;ij;i){ //循环条件 ij最后要处理最后一个元素if(nums[i]*nums[i]nums[j]*nums[j]){// i位置的元素的绝对值大arr[k--]nums[i]*nums[i];}else{// j位置的元素的绝对值大arr[k--]nums[j]*nums[j];i--; //i保持不动j--;}}return arr;}
}4.长度最小的子数组
4.1题目
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] 并返回其长度**。**如果不存在符合条件的子数组返回 0 。
示例一
输入target 7, nums [2,3,1,2,4,3]
输出2
解释子数组 [4,3] 是该条件下的长度最小的子数组。示例二
输入target 4, nums [1,4,4]
输出1示例三
输入target 11, nums [1,1,1,1,1,1,1,1]
输出04.2思路
4.2.1暴力解法
解法一暴力解法两层for循环第一层为子序列的起始位置第二层为子序列的终点位置在第二层中逐渐累加子序列的值若发现target则与原来的子序列长度比较是否需要替换
class Solution {public int minSubArrayLen(int target, int[] nums) {int minInteger.MAX_VALUE; //子序列的值int sum0;for(int i0;inums.length;i){ //i为起始位置sum0; //重置sum0for(int ji;jnums.length;j){ //j为终点位置sumnums[j];if(sumtarget){minmin(j-i1)?(j-i1):min; //更新子序列的长度}}}return minInteger.MAX_VALUE?0:min;}
}4.2.2滑动窗口双指针升级
解法二滑动窗口 问题如何使用一个for循环就能确定子序列的起始、终点位置解决 动态更改子序列的起始位置for循环确定子序列的终点位置只要当sumtarget第一更新子序列长度的值第二滑动子序列的起始位置先更新子序列总和再滑动
class Solution {public int minSubArrayLen(int target, int[] nums) {int minInteger.MAX_VALUE;int sum0;int i0; //i为起始位置for(int j0;jnums.length;j){ //j为终点位置sumnums[j];while(sumtarget){//1、更新子序列的长度minmin(j-i1)?(j-i1):min;//2、滑动起始位置先减去初始位置的值再滑动sum-nums[i];i;}}return minInteger.MAX_VALUE?0:min;}
}5.螺旋矩阵2
5.1题目
59. 螺旋矩阵 II
给你一个正整数 n 生成一个包含 1 到 n2 所有元素且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例一
输入n 3
输出[[1,2,3],[8,9,4],[7,6,5]]示例二
输入n 1
输出[[1]]5.2思路 每次赋值可分为4次上、右、下、左 首先明确每次赋值确保都是左闭右开即1 23 45 67 8 循环的圈数loopn/2n为3时循环一圈n为4时循环两圈若 n为奇数则最后中间还有个值arr(n/2)(n/2)每次循环过后右边界都要缩小一格注意每次循环过后起始点的位置
class Solution {public int[][] generateMatrix(int n) {int loopn/2;int count1;int[][] arrnew int[n][n];int start0; //每次循环的开始点start,startint i0;int j0;int offset1; //每次循环右边界收缩一位控制每条边的遍历长度for(int k0;kloop;k){ //k表示正在循环的圈数istart; //更新起始点jstart;//上从左到右for(jstart;jn-offset;j){arr[i][j]count;}//右从上到下for(istart;in-offset;i){arr[i][j]count;}//下从右到左for(;jstart;j--){arr[i][j]count;}//左从下到上for(;istart;i--){arr[i][j]count;}start; //循环起始点加一offset;}if (n % 2 1) {arr[n/2][n/2] count;}return arr;}
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/925974.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!