自学内容网 自学内容网

【04_移动零】

一、问题

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]
输出: [0]

二、思路

初始化指针:定义一个指针non_zero_index,它将用于跟踪下一个非零元素应该放置的位置。初始时,这个指针指向数组的起始位置(索引0)。

遍历数组:使用一个循环遍历数组nums中的每个元素。循环的索引变量是i,它从0开始,直到数组的最后一个元素。

检查元素是否为零:在每次迭代中,我们检查当前索引i处的元素是否为0。

交换非零元素:如果当前元素不是0(即nums[i] != 0),我们需要将它移动到数组的前面。为了实现这一点,我们将当前非零元素与non_zero_index指针所指向的元素进行交换。这样,非零元素就被移动到了数组的前面。

更新非零元素位置指针:交换完成后,我们将non_zero_index向前移动一位,以便在下一次迭代中指向下一个应该放置非零元素的位置。

继续遍历:循环继续进行,直到遍历完数组中的所有元素。

结束:当循环结束后,所有非零元素都已经被移动到了数组的前面,而零元素则被留在了后面。

返回结果:最后,函数返回修改后的数组。

三、解法

class Solution:
    def moveZeroes(self, nums: list[int]) -> None:
        left = 0
        right = 0
        for right in range(len(nums)):
            if nums[right] != 0:
                nums[left],nums[right] = nums[right],nums[left]
                left += 1
        return  nums

if __name__ == '__main__':
    nums = [0,1,0,3,5,0,12]
    solution = Solution()
    result = solution.moveZeroes(nums)
    print(result)

四、学习汇总

学习到的:
1、指针是索引维度的,所以,指针left ,可以用nums[left]来表示
2、遍历索引,需要使用range(len(nums))
3、


关于双指针:

双指针是一种常用的算法设计技巧,它利用两个或多个指针来遍历和操作数据结构,尤其是在数组和字符串中。双指针技术可以解决多种问题,如搜索、排序、滑动窗口等。以下是双指针技术的一些基本原理和应用场景:

### 基本原理

1. **遍历**:双指针通常用于遍历数据结构,一个指针从开始位置移动,另一个从结束位置或中间位置移动。

2. **分割**:通过两个指针,可以将数据结构分割成多个部分,分别处理。

3. **比较**:两个指针可以用于比较数据结构中的元素,以找到特定的条件或模式。

4. **更新**:在遍历过程中,可以根据需要更新指针指向的元素。

5. **优化**:双指针可以减少不必要的操作,提高算法的效率。

### 应用场景

1. **查找特定元素**:
   - **两个元素之和**:给定一个数组和一个目标值,找出数组中加起来等于目标值的两个元素的索引。通过一个指针固定一个元素,另一个指针遍历数组找到匹配的元素。

2. **滑动窗口**:
   - **最长子串**:找出一个字符串中不包含重复字符的最长子串。使用两个指针定义窗口的开始和结束,移动结束指针扩展窗口,直到遇到重复字符,然后移动开始指针缩小窗口。

3. **排序**:
   - **归并排序**:使用双指针分别指向已排序数组的起始位置,逐步合并。

4. **搜索旋转排序数组**:
   - **二分查找的变种**:在旋转过的有序数组中查找特定元素,通过比较中间元素与两端点,决定指针如何移动。

5. **链表问题**:
   - **链表相交**:找出两个链表相交的起始节点。使用两个指针分别遍历两个链表,如果链表长度不同,则让较长链表的指针先走,直到两个指针相遇。

6. **循环数组问题**:
   - **循环链表的入口**:使用快慢指针,快指针每次走两步,慢指针每次走一步,如果存在环,则快慢指针会相遇。

7. **矩阵问题**:
   - **搜索矩阵**:在一个有序矩阵中查找一个元素,可以使用双指针从矩阵的左上角开始,根据元素值调整指针位置。

### 实现技巧

- **同步移动**:两个指针同步移动,一个指针固定,另一个根据条件移动。
- **异步移动**:两个指针独立移动,根据各自的条件调整位置。
- **交叉使用**:在某些情况下,两个指针可能会交换角色或位置。

双指针技术的核心在于通过控制指针的移动和位置,有效地解决问题,同时优化算法的性能。


原文地址:https://blog.csdn.net/weixin_42333261/article/details/142553080

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!