LeetCode刷题,你有哪些高效的编程算法推荐?

2023-06-05 00:06:51 算法 高效 你有

LeetCode是一个非常著名的在线编程题库,它涵盖了各个难度级别的编程题目,从初学者到专家都能够从中获得挑战和成长。在LeetCode上刷题,不仅可以提升自己的编程能力,还能够学习到各种高效的编程算法。本文将介绍一些常用的编程算法,帮助读者更加高效地刷题。

一、双指针算法

双指针算法是一种常用的高效算法,它的核心思想是在一个数组链表中,维护两个指针,分别指向不同的位置,通过移动指针来解决问题。双指针算法通常可以将时间复杂度从O(n^2)降低到O(n)。

下面是一个使用双指针算法的例子。假设有一个有序数组nums和一个目标值target,要在数组中找到两个数,使它们的和等于target。可以使用双指针算法,分别从数组的两端开始移动指针,根据指针所指的值与目标值的比较,来确定指针移动的方向。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int left = 0, right = nums.size() - 1;
        while (left < right) {
            int sum = nums[left] + nums[right];
            if (sum == target) {
                return {left, right};
            } else if (sum < target) {
                left++;
            } else {
                right--;
            }
        }
        return {};
    }
};

二、动态规划算法

动态规划算法是一种常用的优化算法,它的核心思想是将一个复杂的问题分解成若干个简单的子问题,并且每个子问题只需要求解一次,然后将其结果保存起来,避免重复计算。动态规划算法通常可以将时间复杂度从O(2^n)降低到O(n^2)或者更低。

下面是一个使用动态规划算法的例子。假设有一个数组nums,要在其中找到一个子数组,使得子数组的和最大。可以使用动态规划算法,定义一个状态数组dp,其中dp[i]表示以nums[i]结尾的子数组的最大和。然后根据状态转移方程dp[i] = max(dp[i-1] + nums[i], nums[i]),计算出dp数组的所有值,最终返回dp数组中的最大值即可。

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int n = nums.size();
        vector<int> dp(n);
        dp[0] = nums[0];
        int res = dp[0];
        for (int i = 1; i < n; i++) {
            dp[i] = max(dp[i-1] + nums[i], nums[i]);
            res = max(res, dp[i]);
        }
        return res;
    }
};

三、二分查找算法

二分查找算法是一种常用的搜索算法,它的核心思想是将一个有序数组分成两部分,然后根据目标值与中间值的大小比较,确定目标值在哪一部分,然后继续在该部分中进行查找,直到找到目标值或者确定目标值不存在为止。二分查找算法通常可以将时间复杂度从O(n)降低到O(logn)。

下面是一个使用二分查找算法的例子。假设有一个有序数组nums和一个目标值target,要在数组中找到目标值的位置。可以使用二分查找算法,定义一个左边界left和右边界right,然后在每次查找中,计算出中间位置mid,根据mid所指的值与目标值的比较,来确定目标值在哪一部分,然后继续在该部分中进行查找。

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0, right = nums.size() - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return -1;
    }
};

综上所述,双指针算法、动态规划算法和二分查找算法是LeetCode刷题中常用的高效算法。当然,还有很多其他的算法,比如贪心算法、分治算法、回溯算法等等,读者可以根据自己的需要和兴趣,选择学习和使用。

相关文章