Day 3 知识点:贪心,二分,二分答案

贪心

贪心算法:是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。

贪心算法在有最优子结构的问题中尤为有效。

在此阶段,八字箴言:大胆假设,小心求证。只需要假设正确的贪心策略,求正确性根据是否能够找到反例即可。

二分

常见题型:

  1. 在有序序列中,查询 k 数字是否存在(无相同的数字)

  2. 在有序序列中,查询第一个大于等于 k 数字是否存在(存在相同的数字)
    1 5 5 5 9 10 查询第一个大于等于 5,在第 2 个数字

  3. 在有序序列中,查询第一个大于 k 数字是否存在(存在相同的数字)
    1 5 5 5 9 10 查询第一个大于 5,在第 5 个数字

【二分模板】
以第一个大于等于 need 为例:

// 搜索区间 [L,R],只有当搜索区间不是正确的区间时,结束搜索
while (L <= R) {
	int mid = (L + R) / 2;		// 正中间的下标用左端下标 + 右端下标之和 / 2 得到
	// 随后根据正中间的数值判断下一步向哪个区间进一步的查找
	if (a[mid] < need) L = mid + 1;	// 新的区间范围是 [mid + 1, R]
	else res = mid, R = mid - 1;	// 新的区间范围是 [L, mid - 1]
}

二分答案

二分答案与二分查找类似,即对有着单调性的答案进行二分,大多数情况下用于求解满足某种条件下的最大(小)值。答案和某一关系呈现单调性,如同二分时一样,可以根据中间值判断向左右两边查询。

二分答案模板:
通过 check 函数来校验,是否答案题目的需求

bool check() {
	...
	return ...
}

while (L <= R) {
	int mid = (L + R) / 2;
	if (check()) {
		...			// 如果满足题目,记录答案,并且区间修改
	} else ...		// 不满足题目,区间修改
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值