🎉🎉🎉写在前面:
博主主页:🌹🌹🌹戳一戳,欢迎大佬指点!
博主秋秋:QQ:1477649017 欢迎志同道合的朋友一起加油喔💪
目标梦想:进大厂,立志成为一个牛掰的Java程序猿,虽然现在还是一个小菜鸟嘿嘿
-----------------------------谢谢你这么帅气美丽还给我点赞!比个心-----------------------------
🌈题目一(盛水最多的容器):
🌟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;
}
}
图示:
今日的刷题分享就到这了咩,如果大家觉得不错的话还请帮忙点点赞呢,十分感谢呢!🥰🥰🥰