力扣

Posted LinZeLiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣相关的知识,希望对你有一定的参考价值。

题目

剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

思路1

  • 使用头尾双指针leftright,分别指向最左边和最右边
  • left向右移动,直到遇到了偶数停下
  • right向左移动,直到遇到了奇数停下
  • 交换left和right的值
  • 如果left大于等于right,说明调整完成

代码

class Solution {
    public int[] exchange(int[] nums) {
        int length = nums.length;
        int left = 0;
        int right = length-1;

        while (left < right) {
            // 找偶书
            while (left < right && nums[left] % 2 == 1) {
                left++;
            }
            // 找奇数
            while (right > left && nums[right] % 2 == 0) {
                right--;
            }
            // 只有在left小于right情况下才交换
            if (left < right) {
                int temp = nums[left];
                nums[left] = nums[right];
                nums[right] = temp;
                // 交换完成后顺便指针移动一下
                left++;
                right--;
            }
        }

        return nums;
    }
}

复杂度分析

  • 时间复杂度:\\(O(N)\\)
  • 空间复杂度:\\(O(1)\\)

思路2

  • 使用快慢指针
  • 初始时候,两个指针都是指向最左端
  • 快指针每次前进一格,如果遇到了奇数,就喝慢指针进行交换,然后两个指针都前进一步
  • 如果两个指针在同一个位置则不进行交换

代码

class Solution {
    public int[] exchange(int[] nums) {
        int length = nums.length;
        int slow = 0;
        int fast = 0;

        while (slow < length && fast < length) {
            if (nums[fast] % 2 == 1) {
                if (fast != slow) {
                    int temp = nums[fast];
                    nums[fast] = nums[slow];
                    nums[slow] = temp;
                }
                slow++;
            }
            fast++;
        }
        return nums;
    }
}

复杂度分析

  • 时间复杂度:\\(O(N)\\)
  • 空间复杂度:\\(O(1)\\)
我走得很慢,但我从不后退!

贪心——力扣455.分发饼干&&力扣376.摆动序列

力扣455.分发饼干

题目描述

思路代码

我们应该怎么贪才是最合理,联想局部最优到整体最优,我们是不是可以先用大饼干喂大胃口,再统计小孩数量;或者先用小饼干喂小胃口,再统计小孩数量

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) 
    {
        sort(g.begin(), g.end());
        sort(s.begin(), s.end());
        int index = 0;
        for(int i = 0; i < s.size(); i++)
        {
            if(index < g.size() && g[index] <= s[i])
            {
                index++;
            }
        }
        return index;
    }
};

力扣376.摆动序列

题目描述

思路代码

刚开始拿到题陷进去了,又想让我删或不删,还要求最大摆动序列;看了题解,才知道又是贪心,那到底怎么贪,我们先思考题目到底要求什么,求最长的摆动序列,我们再思考局部最优到整体最优,如果我们删除单调坡度上的节点,但是不删两端,那坡上是不是只剩一个波峰和波谷,那么我们只要判断局部到整体的峰值,是不是就可以算出最长的摆动序列,所以不用删除操作,我们贪的就是让峰值一直保持,然后删除单调坡度上的节点,这里用一下题解的图

prediff是前一组峰值差,curdiff是当前的峰值差,我们先默认最右端一定存在一个峰值res,初始化为1,我们需要判断满足res++的条件, prediff <= 0 && curdiff > 0 或者 prediff >= 0 || curdiff < 0,到这里问题基本就迎刃而解了

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) 
    {
        if(nums.size() <= 1) return nums.size();
        //默认最右端的峰值存在
        int res = 1;
        //前一对峰值
        int PreDiff = 0;
        //当前一对峰值
        int CurDiff = 0;

        for(int i = 0; i < nums.size() - 1; i++)
        {
            CurDiff = nums[i + 1] - nums[i];
            if((PreDiff <= 0 && CurDiff > 0) || (PreDiff >= 0 && CurDiff < 0))
            {
                res++;
                PreDiff = CurDiff;
            }
        }
        return res;
    }
};

以上是关于力扣的主要内容,如果未能解决你的问题,请参考以下文章

贪心——力扣55.跳跃游戏&&力扣45.跳跃游戏Ⅱ

贪心——力扣53.最大子序和&&力扣122.买卖股票的最佳时机Ⅱ

刷力扣明白了官网代码的小心机(代码的优化)

链表

力扣刷题资源

力扣刷题详解(含代码动态展示)