滇中引水工程建设管理局网站,智慧团建官网手机登录入口电脑版,wordpress去掉cat,怎么交换友情链接解题思路#xff1a; \qquad 适用双指针#xff0c;l#xff1a;最左边‘0’元素坐标#xff1b;r#xff1a;l右边第一个非零元素坐标。 \qquad 最初的思路#xff1a;将l和r初始化为0#xff0c;遍历数组nums若任意一个指针到达数组末尾时停止。若当前nums[l] 0则移… 解题思路 \qquad 适用双指针l最左边‘0’元素坐标rl右边第一个非零元素坐标。 \qquad 最初的思路将l和r初始化为0遍历数组nums若任意一个指针到达数组末尾时停止。若当前nums[l] 0则移动r找到第一个非零元素时交换二者的值否则nums[l] ! 0则移动l 去寻找0元素。每次仅移动一次指针l或r。 \qquad 这个思路虽然可行但实现代码仍有些繁琐需要同时移动两个指针并且考虑两个指针的范围问题。其优化的版本早已在快速排序的思想中体现。
优化思路 \qquad l假设以其为分界点左边均为非零元素右边均为0元素 \qquad r不断向右探索的指针直至遍历到数组最后一个元素停止。 \qquad 初始化l 0r 0。 \qquad 当nums[r] ! 0将nums[l]与nums[r]的值交换同时l右移1以保证假设成立。若数组中无0元素在移动过程中l r当存在0元素时l与r才会拉开距离且nums[r]始终指向第一个0元素。 \qquad 很多算法题的解题思路都与数学归纳法类似。要创造自己一个假设并在每一步都要做与假设一致的操作维持假设成立最后将假设变成“现实”。最重要的是如何找到一个最合适的假设。
优化代码 \qquad 1使用swap(a,b)函数交换变量的值。而非使用中间变量temp进一步简化代码。 头文件#includealgorithm
class Solution {
public:void moveZeroes(vectorint nums) {int l 0, r 0;while(r nums.size()){if(nums[r] ! 0){swap(nums[l], nums[r]);l;}r;}}
};