当前位置:网站首页>采用快慢指针法来解决有关数组的问题(C语言)
采用快慢指针法来解决有关数组的问题(C语言)
2022-06-11 11:41:00 【Butayarou】
题目一
题目来源(力扣):移除元素
题目描述:
给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例:
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
这道题是移除指定值的元素。
【基本思路】
先将 slow 和 fast 都初始化为 0 。
( fast 是用来表示当前遍历到的位置的下标,slow 是用来表示要填入的位置的下标 )
当 fast 遇到要移除的元素时,跳过它(将 fast 后移一位)。
当 fast 遇到的元素不是要移除的,先将 nums[fast] 的值赋给 nums[slow],再让 slow 和 fast 都后移一位。
将上述整理成代码如下。
int removeElement(int* nums, int numsSize, int val){
int slow = 0, fast = 0;
while(fast < numsSize)
{
if(nums[fast] != val)
nums[slow++] = nums[fast++];
else
fast++;
}
return slow; //最后数组的新长度是 slow
}
题目二
题目来源(力扣):删除有序数组中的重复项
题目描述:
给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
示例:
输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
这道题是将重复的元素都删掉,使得不同的元素均只出现一次。
【基本思路】
先将 slow 和 fast 分别初始化为 0 和 1 。
经过分析,有以下两种情况:
情况一:如果 fast 指向位置的元素跟 slow 指向位置的元素不等,先让 slow 后移一位,再把 nums[fast] 的值赋给 nums[slow],最后让 fast 后移一位。
情况二:如果 fast 指向位置的元素跟 slow 指向位置的元素相等,说明存在重复项,只需将 fast 后移一位,重复此步骤直到遇到情况一。
( fast 是用来表示当前遍历到的位置的下标,slow 是用来表示要填入的位置的下标 )
将上述两种情况整理成代码如下。
int removeDuplicates(int* nums, int numsSize){
if(numsSize == 0) //如果数组 nums 的长度为 0,即数组不包含任何元素,返回 0。
return 0;
int slow = 0, fast = 1;
while(fast < numsSize)
{
if(nums[fast] != nums[slow])
{
++slow;
nums[slow] = nums[fast];
}
++fast;
}
return slow + 1; //最后数组的新长度是 slow + 1
}
这样操作能够保证
下标范围为 [0, slow] 的数组元素都是已经处理好的非重复项,
下标范围为 [slow + 1, fast - 1] 的数组元素都是前面数组元素的重复项。
更多文章
异或的妙用(C语言)
大数相加(C语言)
合并两个有序数组(C语言)
阶乘后的零(C语言)
调整数组顺序使奇数位于偶数前面(C语言)
边栏推荐
- Qt中radioButton使用
- JVM class loading process
- [JUC supplementary] atomic class, unsafe
- C# 将OFD转为PDF
- MSF CS OpenSSL traffic encryption
- Bark – 自己给自己的 iPhone 发推送提醒 – 最简单的推送提醒服务,开源免费
- Interview experience of Xiaomi Android development post~
- P2580 "so he started the wrong roll call"
- Intl.NumberFormat 设置数字格式
- 2020-07 学习笔记整理
猜你喜欢
随机推荐
安全工程师发现PS主机重大漏洞 用光盘能在系统中执行任意代码
测试cos-html-cache静态缓存插件
Elk - elastalert largest pit
为WordPress相关日志插件增加自动缩略图功能
No category parents插件帮你去掉分类链接中的category前缀
【LeetCode】494. Objective and (2 wrong questions)
Create a folder in the WordPress Library
Eulato
普通人应当如何挑选年金险产品?
js面试题---箭头函数,find和filter some和every
NFT digital collection system development and construction process
Problems encountered in installing mysql8 under centos7.x couldn't open file /etc/pki/rpm-gpg/rpm-gpg-key-mysql-2022
The role of Gerber file in PCB manufacturing
ELK - X-Pack设置用户密码
How should ordinary people choose annuity insurance products?
WordPress user name modification plug-in: username changer
Queuing theory model
Etcd introduction
Where is it safer to open an account for soda ash futures? How much does it cost to buy soda ash futures?
Where is it safer to open an account for soda ash futures? How is the deposit calculated?









![my.cnf中 [mysql]与[mysqld] 的区别 引起的binlog启动失败的问题](/img/bd/a28e74654c7821b3a9cd9260d2e399.png)