数组阶段总结

本文总结了LeetCode中数组题目的解题方法,包括二分查找在有序数组中的应用,如搜索插入位置、查找元素范围;快慢指针在删除重复项、移动零等题目中的运用;以及滑动窗口在解决最长不重复子串等问题中的重要性。文中给出了相关题目示例并提到了代码随想录作为参考来源。
摘要由CSDN通过智能技术生成


前言

关于LeetCode数组题目的一些方法


一、二分查找

条件:数组一般为有序数组,升序或者降序排列

代码:(数组为a[n])一般数组索引0的位置设为left,数组索引n-1为right,循环条件为left <= right

// 二分查找
while (left <= right){
	int mid = left + (right - left) / 2;
	if (a[mid] > val){
		left = mid + 1;
	}
	else if (a[mid] < val){
		right = mid - 1;
	}
	else{
		a[mid] == val;
	}
	return left;
}
// 有时用到upper_bound和lower_bound
// upper_bound和lower_bound是直接copy博主负雪明烛的代码
int lower_bound(vector<int>& nums, int target) {
        const int N = nums.size();
        // [l, r)
        int l = 0, r = N;
        while (l < r) {
            int mid = l + (r - l) / 2;
            if (nums[mid] >= target) {
                r = mid;
            } else  {
                l = mid + 1;
            }
        }
        return l;
    }
    int upper_bound(vector<int>& nums, int target) {
        const int N = nums.size();
        // [l, r)
        int l = 0, r = N;
        while (l < r) {
            int mid = l + (r - l) / 2;
            if (nums[mid] <= target) {
                l = mid + 1;
            } else {
                r = mid;
            }
        }
        return l;
    }
}

相关题目:
35.搜索插入位置(opens new window)
34.在排序数组中查找元素的第一个和最后一个位置(opens new window)
69.x 的平方根
367.有效的完全平方数

二、快慢指针

一个slowIndex,一个fastIndex,循环条件是slowIndex <= fastIndex(与二分查找类似)

相关题目:
26.删除排序数组中的重复项
283.移动零
844.比较含退格的字符串
977.有序数组的平方

三、滑动窗口(重要)

(设数组啊a[n])有一个指针先移动较快,遇到(最大/最小/不符合要求)条件时停止,另一个较慢的指针开始移动,循环条件是快慢两个指针都小于数组的长度n。通常一开始要设定一个最大值(最小值)的res,然后动态求res的最小(最大)子串或别的东西

经常使用地方:数组、字符串,最长不重复子串,最小覆盖子串。

使用滑动窗口可能会求不重复,子串,或者有限制数组子串元素个数限制的(水果成篮),此时配合unordered_set或者unordered_map使用会更加好。

相关题目:
904.水果成篮(opens new window)
76.最小覆盖子串(opens new window)
3.无重复字符的最长子串

参考

代码随想录
【LeetCode】34. Find First and Last Position of Element in Sorted Array 解题报告(Python & C++)


总结

复习完代码随想录数组部分的一点小总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值