算法模式

算法模式:改进的二分查找

算法模式:改进的二分查找

D瓜哥
在上一篇文章 算法模式:前缀和 介绍了前缀和的算法模式。本篇文章,继续介绍数组相关的算法模式:改进的二分查找。 二分查找 二分查找相比每一个学过计算机算法的小伙伴都了解,时间复杂度是: \$\log_2N\$,是一个非常高效的数组查找算法。当然,前提是数组必须有序。过程如下: 图 1. 二分查找 LeetCode 704. 二分查找 就是一个标准的二分查找的算法题。代码如下: /** * @author D瓜哥 · https://www.diguage.com * @since 2024-09-14 19:52:26 */ public int search(int[] nums, int target) { int left = 0, right = nums.length - 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 34. 在排序数组中查找元素的第一个和最后一个位置 LeetCode - 34. 在排序数组中查找元素的第一个和最后一个位置 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 \$log_2n\$ 的算法解决此问题。 示例 1: 输入:nums = [5,7,7,8,8,10], target = 8 输出:[3,4] 示例 2: 输入:nums = [5,7,7,8,8,10], target = 6 输出:[-1,-1] 示例 3: 输入:nums = [], target = 0 输出:[-1,-1] 提示:
算法模式:前缀和

算法模式:前缀和

D瓜哥
在上一篇文章 算法模式:差分数组,本篇文章,继续介绍数组相关的算法模式:前缀和。 前缀和 前缀和可以简单理解为「数列的前 n 项的和」。具体过程如图所示: 图 1. 前缀和 这是一种重要的预处理方式,也就是需要额外的空间并且提前计算好这些值。如果使用得当,能大大降低查询的时间复杂度。 LeetCode 303. 区域和检索 - 数组不可变 LeetCode - 303. 区域和检索 - 数组不可变 给定一个整数数组 nums,处理以下类型的多个查询: 计算索引 left 和 right (包含 left 和 right)之间的 nums 元素的 和 ,其中 left <= right 实现 NumArray 类: NumArray(int[] nums) 使用数组 nums 初始化对象 int sumRange(int left, int right) 返回数组 nums 中索引 left 和 right 之间的元素的 总和,包含 left 和 right 两点(也就是 nums[left] + nums[left + 1] + …​ + nums[right] )
算法模式:差分数组

算法模式:差分数组

D瓜哥
Christopher Alexander 在 《建筑的永恒之道》 中说:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动。”受此影响,GoF 总结经验,写出了著名的 《设计模式》。 在算法中,也有很多类似设计模式这样的解决方案。D瓜哥称其为“算法模式”。后面,慢慢写文章一一介绍一下。由浅及深,今天先来介绍最简单的一个模式:差分数组。 差分数组 差分数组:差分数组就是原始数组相邻元素之间的差。举例如下: 下标 0 1 2 3 4 5 原始数组 5 9 2 6 5 3 差分数组 5 4 -7 4 -1 -2 差分数组是从原始数组构造出来的一个辅助数组,表示相邻元素直接的差值。可用于解决需要对数组一个区间内同时做加减的操作。比如:随着公交站各个站台上下车,判断公交车是否超载。 LeetCode 370. 区间加法 LeetCode - 370. 区间加法 假设你有一个长度为 n 的数组,初始情况下所有的数字均为 0,你将会被给出 k 个更新的操作。