原地算法

博客可能围绕原地算法展开,原地算法是信息技术领域重要概念,在数据处理等方面有应用,能在不额外开辟大量空间的情况下对数据进行操作,可提高效率和节省资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

### 关于线性枚举的原地算法 #### 定义与特点 线性枚举是一种简单而高效的遍历方式,通常用于访问数组中的每一个元素。当提到“原地算法”时,意味着该算法不需要额外的空间来存储中间结果,仅利用输入数据本身的内存空间完成计算[^1]。 #### 示例:移除数组中的重复项(O(n) 时间复杂度) 下面是一个经典的例子——移除非零元素并将其移到数组前端,同时保持其他元素顺序不变。此问题可以通过双指针技术在线性时间内解决,并满足原地修改的要求: ```cpp class Solution { public: void moveZeroes(vector<int>& nums) { int dest = 0; // 非零元素的目标位置 for (int cur = 0; cur < nums.size(); ++cur) { // 当前扫描的位置 if (nums[cur] != 0) { swap(nums[dest], nums[cur]); // 如果当前元素不为零,则交换到目标位置 dest++; // 更新目标位置 } } } }; ``` 上述代码展示了如何通过两个索引来实现这一功能,`dest`表示非零元素应放置的位置,而`cur`则负责逐一检查数组中的每个元素[^5]。 #### 示例:判断快乐数 另一个有趣的例子是检测一个整数是否为“快乐数”。这个问题也可以在一个循环中高效地解决,其核心在于使用慢快指针法避免无限循环的发生。以下是具体实现: ```cpp class Solution { public: int bitSum(int n) { int sum = 0; while (n) { int x = n % 10; sum += x * x; n /= 10; } return sum; } bool isHappy(int n) { int slow = n, fast = bitSum(n); while (slow != fast) { slow = bitSum(slow); fast = bitSum(bitSum(fast)); } return slow == 1; } }; ``` 这里采用了类似于链表查找环的技术,在每次迭代过程中更新两个变量直到它们相遇或者找到固定点 `1` [^3]。 #### 矩阵旋转问题 对于矩阵顺时针方向90°旋转的问题,如果希望达到 O(1) 的辅助空间需求,则需深入分析单次变换规律。一种常见做法是从外层向内逐圈处理每一层的数据置换关系[^4]。 ```python def rotate(matrix): n = len(matrix) for i in range(n // 2): for j in range(i, n - i - 1): temp = matrix[i][j] matrix[i][j] = matrix[n-j-1][i] matrix[n-j-1][i] = matrix[n-i-1][n-j-1] matrix[n-i-1][n-j-1] = matrix[j][n-i-1] matrix[j][n-i-1] = temp ``` 以上 Python 版本实现了基于四角互换原则的一次性就地转换方案。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值