美文网首页
leetcode 初级算法 数组

leetcode 初级算法 数组

作者: 寻靥 | 来源:发表于2020-09-08 09:31 被阅读0次

原题目链接

删除排序数组中的重复项

====>双指针动画演示

双指针解题代码思路

int removeDuplicates(int* nums, int numsSize){
    int i=0,j=1;
    for (j=1; j<numsSize; j++) {
        if (i+1==j && nums[i] != nums[j]) {//i,j相邻且不等,都向后移动
            i++;
        }else if (nums[i] == nums[j]) {//相等,只有j向后移动
            
        }else if (nums[i] != nums[j]) {//不相邻,且不等,i后移,j赋值给i
            i++;
            nums[i] = nums[j];
        }
    }
    return i+1;
}

简化代码

int removeDuplicates(int* nums, int numsSize){
    int i=0;
    for (int j=1; j<numsSize; j++) {
        if (nums[i] != nums[j]) {
            i++;
            if (i!=j) nums[i] = nums[j];//这句判断可以不加,相当于自己赋值给自己
        }
    }
    return i+1;
}

复杂度分析:
时间复杂度:O(n)。
空间复杂度:O(1)。

买卖股票的最佳时机 II

计算相邻两天的差值,为正就累加到利润里就可以了

int maxProfit(int* prices, int pricesSize){
    int sum = 0;
    for (int i=0; i<pricesSize-1; i++) {
        if (prices[i+1] > prices[i]) {
            sum = sum + prices[i+1]-prices[i];
        }
    }
    return sum;
}

复杂度分析:
时间复杂度:O(n),遍历一次。
空间复杂度:O(1),需要常量的空间。

旋转数组

方法一

每次所有数向右移动一位,移动k次

void rotate(int* nums, int numsSize, int k){
    int t = 0;
    for (int i=0; i<k; i++) {
        t = nums[numsSize-1];//记下最后一个数
        for (int j=0; j<numsSize-1; j++) {
            nums[numsSize-1-j] = nums[numsSize-2-j];//依次向右移动一位,移动numsSize-1次
        }
        nums[0] = t;//把最后一位给到第一位
    }
}

复杂度分析
时间复杂度:O(n*k) 。每个元素都被移动 1 步(O(n)) k次(O(k)) 。
空间复杂度:O(1)。没有额外空间被使用。

方法二

环装替换

让第一个数向右移动k,并替换。被替换数也向右移动k,替换...以此类推,替换n次

void rotate(int* nums, int numsSize, int k){
     int  n=0, t=0, num = nums[0], j = 0;//n为第一个移动的数,t交换数用,num存被替换的数,j记录num的角标
     for (int i=0; i<numsSize; i++) {//替换numsSize次
         int m = (j+k)%numsSize;//m为被替换数的角标
         t = nums[m];
         nums[m] = num;//替换
         if (n == m) {//如果被替换数已经m已经等于n了,继续替换就重复了,所以向n后一位移动,再开始替换
             n = m+1>numsSize-1?0:m+1;//如果向后一位造成数组越界,那么把0赋值给n
             j = n;
             num = nums[j];//更新num
         }else {
             j = m;
             num = t;//把被替换数存到num里
         }
     }
}

复杂度分析
时间复杂度:O(n) 。
空间复杂度:O(1)。没有额外空间被使用。

相关文章

  • leetcode|初级算法-数组

    01 起 刷题固然爽快,但及时总结才是进步之道,下面就数组部分的题目进行回顾和总结。 注意,刷题使用的语言是Pyt...

  • leetcode 初级算法 数组

    原题目链接 删除排序数组中的重复项 ====>双指针动画演示 双指针解题代码思路 简化代码 复杂度分析:时间复杂度...

  • leetcode初级算法|数组

    删除排序数组中的重复项[https://leetcode-cn.com/leetbook/read/top-int...

  • LeetCode初级算法--设计问题01:Shuffle an

    LeetCode初级算法--设计问题01:Shuffle an Array (打乱数组) 搜索微信公众号:'AI-...

  • LeetCode初级算法--数组02:旋转数组

    LeetCode初级算法--数组02:旋转数组 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事...

  • LeetCode基础算法-数组

    LeetCode基础算法-数组 算法 LeetCode 数组相关 1. 从排序数组中删除重复项 描述:给定一个排序...

  • First Missing Positive

    标签: C++ 算法 LeetCode 数组 每日算法——leetcode系列 问题 First Missing...

  • Next Permutation

    标签: C++ 算法 LeetCode 数组 每日算法——leetcode系列 问题 Next Permuta...

  • Trapping Rain Water

    标签: C++ 算法 LeetCode 数组 每日算法——leetcode系列 问题 Trapping Rain...

  • Combination Sum

    标签: C++ 算法 LeetCode 数组 DFS 每日算法——leetcode系列 问题 Combinat...

网友评论

      本文标题:leetcode 初级算法 数组

      本文链接:https://www.haomeiwen.com/subject/zzhdektx.html