每日一刷
Introduction
记录力扣,牛客刷题
算法记录
不定时记录
双指针
双指针算法是一种高效的遍历技术,它通过在数据结构中设置两个指针来解决特定的问题。这两个指针可以以不同的速度移动,或者从数据结构的不同位置开始,以实现快速的数据处理。
例如,在排序数组中查找目标值时,可以使用两个指针分别指向数组的两端,通过逐步向中间靠拢来缩小搜索范围。在数组去重的场景中,一个指针用于遍历数组,而另一个指针则用于记录去重后的结果。
这种算法的优势在于它能够减少不必要的比较和操作,从而提高算法的效率。双指针技术广泛应用于各种算法问题中,如滑动窗口问题、两数之和问题、循环链表检测等,是算法设计中的一种重要工具。
经典
快慢指针
class Solution {
public int removeDuplicates(int[] nums) {
int slow = 0, fast = 1;
while (fast < nums.length) {
if (nums[slow] != nums[fast]) {
nums[++slow] = nums[fast];
}
fast++;
}
return slow + 1;
}
}贪心算法
贪心算法(英语:greedy algorithm),又称贪婪算法,是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。比如在旅行推销员问题中,如果旅行员每次都选择最近的城市,那这就是一种贪心算法。
贪心算法在有最优子结构的问题中尤为有效。最优子结构的意思是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解。
贪心算法与动态规划的不同在于它对每个子问题的解决方案都做出选择,不能回退。动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能。
贪心法可以解决一些最优化问题,如:求图中的最小生成树、求哈夫曼编码……对于其他问题,贪心法一般不能得到我们所要求的答案。一旦一个问题可以通过贪心法来解决,那么贪心法一般是解决这个问题的最好办法。由于贪心法的高效性以及其所求得的答案比较接近最优结果,贪心法也可以用作辅助算法或者直接解决一些要求结果不特别精确的问题。在不同情况,选择最优的解,可能会导致辛普森悖论(Simpson's Paradox),不一定出现最优的解。
贪心算法在数据科学领域被广泛应用,特别是金融工程。其中一个贪心算法例子就是Ensemble method。
动态规划
动态规划(英语:Dynamic programming,简称DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。
动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。
动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。
通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量:一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。
