正文
1 | fun doublePointer(arr: IntArray): Int { |
1 | fun doublePointer(arr: IntArray): Int { |
1 | fun twoPointers(nums1: IntArray, nums2: IntArray) { |
1 | fun slidingWindow(nums: IntArray, k: Int): Int { |
以下是一个前缀和算法的常见模板:
1 | fun prefixSum(nums: IntArray): IntArray { |
在这个模板中,我们使用一个额外的数组 prefixSum 来存储原始数组 nums 的前缀和。通过遍历原始数组,我们可以计算每个位置的前缀和并存储在 prefixSum 中。
使用前缀和数组 prefixSum,我们可以高效地回答多个查询,例如计算某个区间的和。假设我们需要计算区间 [left, right] 的和,我们可以使用如下方式获取结果:
1 | val sum = prefixSum[right + 1] - prefixSum[left |
这个计算结果即为原始数组中从位置 left 到位置 right 的元素之和。
请注意,在模板中,前缀和数组 prefixSum 的长度比原始数组 nums 的长度多了一个元素。这是为了方便计算区间和时的边界情况。
以下是一个高效的字符串构建算法模板:
1 | fun buildString(chars: List<Char>): String { |
在这个模板中,我们使用 StringBuilder 来构建字符串。StringBuilder 是可变的字符串类,可以高效地进行字符串的拼接操作。
我们通过遍历字符列表 chars,逐个将字符添加到 StringBuilder 中。最后,通过调用 toString() 方法,将 StringBuilder 转换为最终的字符串结果并返回。
使用 StringBuilder 的好处是它避免了在每次拼接字符串时创建新的字符串对象,从而提高了性能和效率。特别是在需要频繁拼接大量字符串的情况下,使用 StringBuilder 可以避免不必要的性能损耗。
使用这个模板,你可以根据具体需求构建字符串。可以根据问题的要求在遍历过程中进行一些字符处理、条件判断等操作。
在模板中,我们使用两个指针,一个指针每次向后移动一个节点,另一个指针每次向后移动两个节点。如果链表中存在循环,快指针最终会追上慢指针,这样我们就可以判断出链表有循环。如果链表没有循环,快指针会先到达链表的末尾,此时我们就可以判断链表没有循环。
1 | fun hasCycle(head: ListNode?): Boolean { |
1 | class ListNode(var value: Int) { |
1 | fun numSubarraysWithSum(nums: IntArray, goal: Int): Int { |
1 | fun monotonicStack(nums: IntArray): IntArray { |
1 | class TreeNode(var value: Int) { |