LeeCode刷题记录05

本文介绍了双指针技术在编程中的应用,包括对撞时针、快慢指针和分离双指针三种类型,并通过反转字符串的问题进行实例解析。此外,还讲解了滑动窗口算法,以寻找数组中满足特定条件的子序列,以一个包含近似重复元素的示例进行说明。这些算法在数组和字符串处理中有着广泛的应用。
摘要由CSDN通过智能技术生成

双指针(Two Pointers)

双指针(Two Pointers):指的是在遍历元素的过程中,不是使用单个指针进行访问,而是使用两个指针进行访问,从而达到相应的目的。
对撞时针:两个指针方向相反
快慢指针:两个指针方向相同
分离双指针:两个指针分别属于不同的数组 / 链表

例题1:反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

示例 1:

输入:s = [“h”,“e”,“l”,“l”,“o”] 输出:[“o”,“l”,“l”,“e”,“h”]

实现:
在这里插入图片描述

class Solution {
    public void reverseString(char[] s) {
        int n = s.length;
        for (int left = 0, right = n - 1; left < right; ++left, --right) {
            char tmp = s[left];
            s[left] = s[right];
            s[right] = tmp;
        }
    }
}

滑动窗⼝

例题1:

给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。
如果存在则返回 true,不存在返回 false。

示例 1:

输入:nums = [1,2,3,1], k = 3, t = 0 输出:true

class Solution {
    public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
        int n = nums.length;
        TreeSet<Long> ts = new TreeSet<>();
        for (int i = 0; i < n; i++) {
            Long u = nums[i] * 1L;
            // 从 ts 中找到小于等于 u 的最大值(小于等于 u 的最接近 u 的数)
            Long l = ts.floor(u); 
            // 从 ts 中找到大于等于 u 的最小值(大于等于 u 的最接近 u 的数)
            Long r = ts.ceiling(u); 
            if(l != null && u - l <= t) return true;
            if(r != null && r - u <= t) return true;
            // 将当前数加到 ts 中,并移除下标范围不在 [max(0, i - k), i) 的数(维持滑动窗口大小为 k)
            ts.add(u);
            if (i >= k) ts.remove(nums[i - k] * 1L);
        }
        return false;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于LeetCode刷题,我可以提供一些指导和建议。LeetCode是一个非常受欢迎的在线编程平台,提供了大量的编程题目,涵盖各种算法和数据结构的知识点。 要有效地刷LeetCode题目,以下是一些建议: 1. 熟悉常见的数据结构和算法:在开始刷题之前,你需要对常见的数据结构(如数组、链表、栈、队列、树等)和算法(如排序、查找、递归、动态规划等)有一定的了解。 2. 刷题顺序:可以按照题目的难度或者类型进行刷题。刚开始可以选择一些简单的题目,逐渐提升到中等和困难难度的题目。另外,可以按照题目类型进行分类刷题,比如数组、链表、树等。 3. 题目分析:在开始解题之前,仔细阅读题目,并理解问题的要求。可以考虑一些边界情况和特殊情况。 4. 设计合适的解决方案:根据题目要求,设计出符合要求的解决方案。可以先在纸上画图或者写伪代码,再实现代码。 5. 编写高质量的代码:编写代码时,注意代码的可读性、可维护性和效率。可以考虑使用适当的数据结构和算法来优化代码。 6. 调试和测试:编写完代码后,进行调试和测试,确保代码能够正确地解决问题。 7. 多解法比较:对于一道题目,可以尝试不同的解法,比较它们的优劣,并分析其时间复杂度和空间复杂度。 8. 学习他人的解法:在刷题过程中,可以参考他人的解题思路和代码,并学习其中的优秀之处。 9. 刷题计划:可以制定一个刷题计划,每天或每周刷一定数量的题目,并坚持下去。 10. 总结和复习:在刷题过程中,及时总结自己的思考和解题过程,对于一些常见的算法和技巧进行复习和加深理解。 希望以上的建议对你有所帮助。祝你在LeetCode刷题中取得好成绩!如果你有其他问题,也欢迎继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值