力扣地址:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/
举个例子,大概就是想这样,最后返回4,因为有4个不同的数字
class Solution {
public int removeDuplicates(int[] nums) {
// 当数组为0时,返回0
if(nums.length==0){
return 0;
}
// 定义慢指针
int last = 0;
// 定义快指针
int fast = 0;
// 当快指针没有走到末尾的时候
while(fast<nums.length){
// 如果慢快指针指向的数值不等于慢指针指向的数值
if(nums[fast] != nums[last]){
// 慢指针向前移动一位
last++;
// 将慢指针指向的数值变成快指针指向的数值
nums[last] = nums[fast];
}
//快指针向前移动一位
fast++;
}
// 返回满指针+1 这个时候就是不重复数组的长度
return last+1;
}
}
这其中最主要的就是
// 当快指针没有走到末尾的时候
while(fast<nums.length){
// 如果慢快指针指向的数值不等于慢指针指向的数值
if(nums[fast] != nums[last]){
// 慢指针向前移动一位
last++;
// 将慢指针指向的数值变成快指针指向的数值
nums[last] = nums[fast];
}
//快指针向前移动一位
fast++;
}
当快指针没有走到末尾的时候,快指针无论如何都要向前走。
具体变化如下
力扣地址:https://leetcode-cn.com/problems/remove-element/
举个例子,大概是这样
class Solution {
public int removeElement(int[] nums, int val) {
if(nums.length == 0){
return 0;
}
int slow =0;
int fast =0;
// 快指针不到末尾时
while(fast<nums.length){
//快指针不等于需要移除的数值时
if(nums[fast] != val){
//将快指针指向的数值赋值给慢指针
nums[slow] = nums[fast];
//慢指针继续前移
slow ++;
}
//快指针移动
fast++;
}
return slow;
}
}
力扣地址:https://leetcode-cn.com/problems/minimum-size-subarray-sum/
class Solution {
public int minSubArrayLen(int target, int[] nums) {
if(nums.length == 0){
return 0;
}
// 窗口左边界
int left = 0;
// 窗口右边界
int right = 0;
//总和
int sum =0;
// 默认滑动窗口长度
int result = Integer.MAX_VALUE;
// 当滑动窗口右边界没到末尾的时候
while(right <nums.length ){
// 计算滑动窗口内的总和
sum = sum + nums[right];
// 当这次的总和 >= 目标值
while(sum >=target){
// 更新滑动窗口的长度,用上次长度和这次的滑窗长度比,取最短的
result = Math.min(result, right- left+1);
// 更新总和,减去左边界的值
sum = sum - nums[left];
// 滑动窗口左边界向右移动,收缩滑动窗口
left++;
}
// 滑动窗口右边界向右移动
right++;
}
// 如果result没变的话,代表没有符合条件的子数组,返回0,否则返回result
return result == Integer.MAX_VALUE ? 0: result;
}
}
流程如下,主要观察图中绿色的滑动窗口的变化
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
int left = 0;
int right = 0;
// 0的个数 最大为1
int zeroCount = 0;
int result =0;
while(right <nums.length){
if(nums[right] == 0){
zeroCount++;
}
// 0的个数大于一时
while(zeroCount>1){
// 当左指针指向的数值是0的时候,0的个数减一
if(nums[left] == 0){
zeroCount--;
}
// 移动左指针
left++;
}
// 更新结果
result = Math.max(result, right-left+1);
//右指针移动
right++;
}
return result;
}
}
流程如下,主要观察图中绿色的滑动窗口的变化
这个题和上个题的唯一区别就是由一开始允许的1个0变成了K个0
代码变化也不大,就是由1变成了K,完整代码如下
class Solution {
public int longestOnes(int[] nums, int k) {
int left =0;
int right =0;
int zeroCount =0;
int result =0;
while(right<nums.length){
if(nums[right] == 0){
zeroCount++;
}
while(zeroCount >k){
if(nums[left] ==0){
zeroCount--;
}
left++;
}
result = Math.max(result, right - left +1);
right++;
}
return result;
}
}
双指针,就是定义两个指针在指定的数组/链表上游走,在做一些自定义的操作。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有