leetcode 初级算法 数组

原题目链接

删除排序数组中的重复项

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

双指针解题代码思路

int removeDuplicates(int* nums, int numsSize){
    int i=0,j=1;
    for (j=1; j

简化代码

int removeDuplicates(int* nums, int numsSize){
    int i=0;
    for (int j=1; j

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

买卖股票的最佳时机 II

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

int maxProfit(int* prices, int pricesSize){
    int sum = 0;
    for (int i=0; i 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

复杂度分析
时间复杂度: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; inumsSize-1?0:m+1;//如果向后一位造成数组越界,那么把0赋值给n
             j = n;
             num = nums[j];//更新num
         }else {
             j = m;
             num = t;//把被替换数存到num里
         }
     }
}

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

你可能感兴趣的:(leetcode 初级算法 数组)