object-C 解答算法:移动零(leetCode-283)

移动零(leetCode-283)

题目如下图:(也可以到leetCode上看完整题目,题号283)

解题思路:

本质就是把非0的元素往前移动,接下来要考虑的是怎么移动,每次移动多少?

这里需要用到双指针,i 记录每次遍历的元素值, j 记录"非0元素值"需要移动到的位置;

当所有"非0元素值"都移动完了,j 的位置以及j后面的位置 都置为0即可.

代码如下:

复制代码
- (NSMutableArray *)array:(NSMutableArray *)array
{
    int j = 0; //j的初始值为0
    for (int i = 0; i < array.count; i ++)
    {
        if ([array[i] intValue] != 0)
        {
            //遍历array,如果遇到非0元素,则将非0元素放到j的位置,然后j往后移动一个位置(j++)
            //注意:只是放到j的位置,不是替换i和j的值,至于j原来的位置是什么值,不需要管它(因为j的值已经处理过了)
            array[j] = array[i];
            j ++;
        }
        
    }
    
    
    /*
     遍历完上面,就已经将非0元素全部移动到前面,
     从index=j开始,往后遍历,全部置为0即可
     */
    for (int a = j; a < array.count; a ++)
    {
        array[a] = @0;
    }
    
    return array;
}

可以看到,以上代码的时间复杂度为 2n,根据大O渐进表示法,其最终的时间复杂度为n ,即 0(n).

相关推荐
高洁012 分钟前
基于物理交互的具身智能决策框架设计
算法·机器学习·数据挖掘·transformer·知识图谱
REDcker3 分钟前
TCP 拥塞控制算法详解:CUBIC、BBR 及传统算法
tcp/ip·算法·php
偷吃的耗子17 分钟前
[CNN算法理解]:二、卷积层(从生活实例到技术细节)
算法·cnn·生活
2301_7903009618 分钟前
C++与Docker集成开发
开发语言·c++·算法
TracyCoder12318 分钟前
LeetCode Hot100(22/100)——141. 环形链表
算法·leetcode·链表
一起养小猫23 分钟前
Flutter for OpenHarmony 进阶:递归算法与数学证明深度解析
算法·flutter
赛博云推-Twitter热门霸屏工具23 分钟前
Twitter 搜索霸屏的关键词工程方法——从算法理解到赛博云推的系统化执行
算法·twitter·dreamweaver
罗湖老棍子36 分钟前
【区间DP】括号序列:如何求解最长合法子序列?(POJ 2955)
算法·动态规划·区间dp·区间动态规划·端点匹配型
王德博客40 分钟前
【实现常见排序算法】直接插入排序的算法思想
数据结构·算法·排序算法
m0_5648768441 分钟前
分布式训练DP与DDP
人工智能·深度学习·算法