> 文档中心 > Leetcode--刷题之被虐日记(5月12日)

Leetcode--刷题之被虐日记(5月12日)

在这里插入图片描述

🎉🎉🎉写在前面:
博主主页:🌹🌹🌹戳一戳,欢迎大佬指点!
博主秋秋:QQ:1477649017 欢迎志同道合的朋友一起加油喔💪
目标梦想:进大厂,立志成为一个牛掰的Java程序猿,虽然现在还是一个小菜鸟嘿嘿
-----------------------------谢谢你这么帅气美丽还给我点赞!比个心-----------------------------

在这里插入图片描述


Leetcode

  • 🌈题目一(盛水最多的容器):
    • 🌟1,题目解读
    • 🌟2,解法详情
  • 🌈题目二(搜索插入位置):
    • 🌟1,题目解读
    • 🌟2,解法详情
  • 🌈题目三(移除元素):
    • 🌟1,题目解读
    • 🌟2,解法详情

🌈题目一(盛水最多的容器):

在这里插入图片描述


🌟1,题目解读

这个题就是把把数组元素的值抽象成柱状图,求盛水最多。其实就是看我们某两个数组元素的其中较小的那个值,乘上两个元素的间距能有最大值,这样就有了盛水最多。

在这里插入图片描述


🌟2,解法详情

首先,在解题的思路上我们还是用双指针的思想因为涉及到两个数组元素left的初始值为0代表数组第一个元素的下标right的初始值为数组长度值减1代表数组最后一个元素的下标。循环去遍历数组的元素,只要left还小于right,每一次我们都会比较height[left]height[right]的大小记录其中较小的一个值(low),然后哪一方的元素小然后就会将相应的下标变量left或者right减1。最后在每次的循环结束的时候都会计算一下那个盛水的值low乘(right- left + 1),这里因为比较找出较小的那个值后left或者right就减1了,所以这里在算下标间隔值的时候要加上1。

class Solution {    public int maxArea(int[] height) { int left = 0; int right = height.length - 1; int ret = 0; while(left < right){     int low = 0;//用来记录较小的数组元素     if(height[left] < height[right]){  low = height[left];  left++;     }else{  low = height[right];  right--;     }     ret = Math.max(ret,low*(right - left + 1));//利用Math库里面的max找出每次计算出的ret的较大值 } return ret;    }}

当然,最后可能有人会有疑问,为什么每次都是动小的那个那一方的下标变量。我们常识都知道,一个破水桶能装多少水,肯定是取决于它最短的那块板,这里也是一样,我们的目的是找到装水最多的,这个时候其实数组的两个元素之间就是一个水桶,我们看能装多少水完全是取决于小的那个元素。假设我们去动较大的那个元素的下标,那么元素间隔必定减小,但是可能短板还是之前的那个元素或者比之更小,所以在我们选择动较大元素的下标的情况下,它的装水量肯定是要减小的。但是我们动较小元素方的下标,因为已经是短板了,所以动了之后下一个元素可能会比之大,这样计算出的装水量可能会变大。

在这里插入图片描述


🌈题目二(搜索插入位置):

在这里插入图片描述


🌟1,题目解读

这个题可以分成两个步骤来看,首先看target在不在数组里面,在的话就直接返回下标,如果不在,这个时候就得返回其插入位置,也就是target的大小是介于哪两个元素之间的问题。


🌟2,解法详情

可以看到题目给我们的数组是已经有序的,在结合我们的目的,其实我们的第一想法肯定是这个题要用到二分查找,至少我们可以来查看到底在不在数组里面,但是既然都用到二分法了,我们是不是也可以一并把插入的问题解决了呢?答案是可以的,如下:

在这里插入图片描述

我们会发现,就算target不在数组里面,但是最后的left的值就是我们要插入的位置,所以这个题直接用二分法就可以将问题解决了。

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

🌈题目三(移除元素):

在这里插入图片描述


🌟1,题目解读

给定一个数组,就是在数组里面寻找我们的val,找到之后需要用我们数组的元素进行赋值替换,然后返回一个新的数组长度,这个长度是除了元素val的元素的个数,这个在主函数进行输出的时候就不会包含val元素,不过这个题要注意的是只允许我们原地修改,不能借助一个中间数组来完成,并且也指明了数组的元素的顺序是可以变的。


🌟2,解法详情

因为涉及到要进行元素的检测是不是val,然后两个元素之间可能还要赋值,所以在不借助中间元素的情况下,我们利用的方法还是双指针的思想,left下标变量在数组的开头,right下标变量在数组的末尾,然后只要nums[left]不等于val就一直自增,nums[right]只要等于val就自减,当前面nums[left]等于val了,后面nums[right]不等于val,就将nums[right]的值赋值给nums[left],这样就把val的值覆盖了,就一直这样循环,直至left与right相遇,循环结束,数组的所有的不等于val的元素也都集中在了数组的前部分了。

class Solution {    public int removeElement(int[] nums, int val) { int left = 0;//头下标变量 int right = nums.length - 1;//尾下标变量 while(left <= right){     if(nums[right] == val){  right--;     }else if(nums[left] != val){  left++;     }else{  nums[left] = nums[right];  left++;  right--;     } } return left;    }}

图示:

在这里插入图片描述


今日的刷题分享就到这了咩,如果大家觉得不错的话还请帮忙点点赞呢,十分感谢呢!🥰🥰🥰
在这里插入图片描述