<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[HackingGate的博客]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/chch1996</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; chch1996]]></copyright><item><title><![CDATA[多路归并问题]]></title><link>https://blog.csdn.net/chch1996/article/details/130909204</link><guid>https://blog.csdn.net/chch1996/article/details/130909204</guid><author>chch1996</author><pubDate>Sun, 28 May 2023 08:37:41 +0800</pubDate><description><![CDATA[264. 丑数 II
	313. 超级丑数
	373. 查找和最小的K对数字
	632. 最小区间
	719. 找出第 k 小的距离对
	786. 第 K 个最小的素数分数
	1439. 有序矩阵中的第 k 个最小数组和
	1508. 子数组和排序后的区间和
	1675. 数组的最小偏移量
]]></description><category></category></item><item><title><![CDATA[区间覆盖问题]]></title><link>https://blog.csdn.net/chch1996/article/details/129150673</link><guid>https://blog.csdn.net/chch1996/article/details/129150673</guid><author>chch1996</author><pubDate>Tue, 21 Feb 2023 22:16:46 +0800</pubDate><description><![CDATA[区间覆盖问题]]></description><category></category></item><item><title><![CDATA[组合数计算]]></title><link>https://blog.csdn.net/chch1996/article/details/108310018</link><guid>https://blog.csdn.net/chch1996/article/details/108310018</guid><author>chch1996</author><pubDate>Sun, 30 Aug 2020 20:41:33 +0800</pubDate><description><![CDATA[华为笔试题里出现了组合数计算的问题，在此记录一下解法：

求的核心公式是

这个公式可以从直观上很好地理解：从n个物品里选k个的方法数，等于 选第n个物品，在前n-1个物品里选k-1个的方法数 + 不选第n个物品，在前n-1个物品里选k个的方法数。也可以从杨辉三角中推出。

那么求组合数的问题就变成了动态规划问题：



这样计算可以有效避免求组合数时乘法溢出。

如果只需要求固定n的，那么可以进一步优化空间到一维：，注意 j 要从右向左更新。


    int cnk[MAXN] = {0};    .]]></description><category></category></item><item><title><![CDATA[OPPO C++软件开发笔试题 2020.8.29]]></title><link>https://blog.csdn.net/chch1996/article/details/108302935</link><guid>https://blog.csdn.net/chch1996/article/details/108302935</guid><author>chch1996</author><pubDate>Sun, 30 Aug 2020 15:09:12 +0800</pubDate><description><![CDATA[三道编程题都是竞赛题，难度很大。

1.第k大斜率

https://www.luogu.com.cn/problem/P4479


在平面直角坐标系上，有 n 个不同的点。任意两个不同的点确定了一条直线。请求出所有斜率存在的直线按斜率从大到小排序后，第 k 条直线的斜率为多少。

为了避免精度误差，请输出斜率向下取整后的结果。



输入格式：

第一行，包含两个正整数 n 和 k 。

接下来 n 行，每行包含两个整数 xi​,yi​，表示每个点的横纵坐标。

输出格式：

输出一行，包含一个整...]]></description><category></category></item><item><title><![CDATA[大疆嵌入式软件笔试题2020.8.16]]></title><link>https://blog.csdn.net/chch1996/article/details/108044602</link><guid>https://blog.csdn.net/chch1996/article/details/108044602</guid><author>chch1996</author><pubDate>Mon, 17 Aug 2020 14:51:55 +0800</pubDate><description><![CDATA[嵌入式软件岗，两道编程题都是动态规划。

第一题：求出数组中两个不重叠的子数组的最大和。

POJ 2479Maximum sumhttp://poj.org/problem?id=2479

考试的时候没想出来。


#include &lt;vector&gt;
#include &lt;cstdio&gt;
using namespace std;

int helper(const vector&lt;int&gt;&amp; v)
{
    int n = v.size();
    vect.]]></description><category></category></item><item><title><![CDATA[单调队列]]></title><link>https://blog.csdn.net/chch1996/article/details/107973157</link><guid>https://blog.csdn.net/chch1996/article/details/107973157</guid><author>chch1996</author><pubDate>Thu, 13 Aug 2020 13:48:14 +0800</pubDate><description><![CDATA[单调队列往往用来解决滑动窗口最值问题。

目录

1.239. 滑动窗口最大值

2.剑指 Offer 59 - II. 队列的最大值

3.862. 和至少为 K 的最短子数组

1.239. 滑动窗口最大值


给定一个数组 nums，有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k个数字。滑动窗口每次只向右移动一位。

返回滑动窗口中的最大值。



示例:

输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出:...]]></description><category></category></item><item><title><![CDATA[子矩阵求和问题]]></title><link>https://blog.csdn.net/chch1996/article/details/107953241</link><guid>https://blog.csdn.net/chch1996/article/details/107953241</guid><author>chch1996</author><pubDate>Wed, 12 Aug 2020 11:17:43 +0800</pubDate><description><![CDATA[两道类似的子矩阵求和问题，都是化二维为一维去做，一维子数组求和问题有：和为K的子数组个数、最大子数组和，二维子矩阵求可以使用同样的方法。

1074. 元素和为目标值的子矩阵数量


class Solution {
public:
    int numSubmatrixSumTarget(vector&lt;vector&lt;int&gt;&gt;&amp; matrix, int target) {
        int row[300] = {0};
        unordered_map&]]></description><category></category></item><item><title><![CDATA[牛客上需要复习的华为机试题]]></title><link>https://blog.csdn.net/chch1996/article/details/107732395</link><guid>https://blog.csdn.net/chch1996/article/details/107732395</guid><author>chch1996</author><pubDate>Sat, 01 Aug 2020 16:41:31 +0800</pubDate><description><![CDATA[1. 放苹果

https://www.nowcoder.com/practice/bfd8234bb5e84be0b493656e390bdebftpId=37&amp;&amp;tqId=21284&amp;rp=1&amp;ru=/ta/huawei&amp;qru=/ta/huawei/question-ranking


题目描述

把M个同样的苹果放在N个同样的盘子里，允许有的盘子空着不放，问共有多少种不同的分法？（用K表示）5，1，1和1，5，1是同一种分法。

输入

每个用例包含二个整数.]]></description><category></category></item><item><title><![CDATA[linux 内核poll/select/epoll实现剖析]]></title><link>https://blog.csdn.net/chch1996/article/details/107521262</link><guid>https://blog.csdn.net/chch1996/article/details/107521262</guid><author>chch1996</author><pubDate>Wed, 22 Jul 2020 19:48:04 +0800</pubDate><description><![CDATA[转载自https://www.iteye.com/blog/watter1985-1614039

f_ops.poll和wait_queue

poll/select/epoll的实现都是基于文件提供的poll方法(f_op-&gt;poll)，
该方法利用poll_table提供的_qproc方法向文件内部事件掩码_key对应的的一个或多个等待队列(wait_queue_head_t)上添加包含唤醒函数(wait_queue_t.func)的节点(wait_queue_t)，并检查文件当前就绪的状态返回]]></description><category></category></item><item><title><![CDATA[计算几何两题]]></title><link>https://blog.csdn.net/chch1996/article/details/107446282</link><guid>https://blog.csdn.net/chch1996/article/details/107446282</guid><author>chch1996</author><pubDate>Sun, 19 Jul 2020 16:39:04 +0800</pubDate><description><![CDATA[判断直线是否相交和判断线段是否相交似乎是高频面试题，总结一下这两道题目的解法。

首先，二维向量内积 v1 · v2 = x1 * x2 + y1 * y2。二维向量外积 v1×v2 = x1*y2 - x2*y1。

1. 直线是否平行或垂直

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=CGL_2_A


Parallel/Orthogonal


For given two liness1ands2, print "2" i...]]></description><category></category></item><item><title><![CDATA[C++17 string_view 加速子串问题]]></title><link>https://blog.csdn.net/chch1996/article/details/107226446</link><guid>https://blog.csdn.net/chch1996/article/details/107226446</guid><author>chch1996</author><pubDate>Thu, 09 Jul 2020 13:46:02 +0800</pubDate><description><![CDATA[C++17引入了 string_view 类，适用于需要生成子串的问题，避免了字符串复制操作，但不允许修改子串，相当于提供一个子串的视图。基本用法如下：


string str = "hello world";
string_view sv(str);
string_view sub = sv.substr(0, 2);
unordered_map&lt;string_view, int&gt; mp;


除了构造时需要使用string类对象外，取子串的方式和string基本相同，注意使用string_]]></description><category></category></item><item><title><![CDATA[旋转排序数组]]></title><link>https://blog.csdn.net/chch1996/article/details/106881822</link><guid>https://blog.csdn.net/chch1996/article/details/106881822</guid><author>chch1996</author><pubDate>Sun, 21 Jun 2020 10:40:08 +0800</pubDate><description><![CDATA[Leetcode上有四道旋转排序数组的题目，都是使用二分法。使用二分法的关键点是想到这样一个事实：每次二分，左半边和右半边肯定有一边是能确定有序的。那么，无论是找最小值，还是搜索某个数，先在确定有序的那边找，没找到的话再对不确定有序的那边继续二分。

首先要确定，nums[mid] 究竟和 nums[left] 以及 nums[right] 中的哪一个比较，可以把目标值套在一个可确定的区间里。

1. 找最小值问题

如果是找最小值，那么应当使得每次收缩区间，最小值仍然在区间内。 nums[mid] num]]></description><category></category></item><item><title><![CDATA[摩尔投票法]]></title><link>https://blog.csdn.net/chch1996/article/details/106817864</link><guid>https://blog.csdn.net/chch1996/article/details/106817864</guid><author>chch1996</author><pubDate>Wed, 17 Jun 2020 21:19:53 +0800</pubDate><description><![CDATA[摩尔投票法可以用来寻找数组中的多数元素。

经典的摩尔投票法用来寻找数组中出现次数超过一半的元素。如leetcode 169:

1.169. 多数元素


给定一个大小为 n 的数组，找到其中的多数元素。多数元素是指在数组中出现次数大于⌊ n/2 ⌋的元素。

你可以假设数组是非空的，并且给定的数组总是存在多数元素。



示例1:

输入: [3,2,3]
输出: 3
示例2:

输入: [2,2,1,1,1,2,2]
输出: 2


一个数组中出现次数大于n/2的元素最多只有1个。考虑这样一...]]></description><category></category></item><item><title><![CDATA[几道技巧性的数组题]]></title><link>https://blog.csdn.net/chch1996/article/details/106801862</link><guid>https://blog.csdn.net/chch1996/article/details/106801862</guid><author>chch1996</author><pubDate>Wed, 17 Jun 2020 10:51:19 +0800</pubDate><description><![CDATA[1.面试题03. 数组中重复的数字


找出数组中重复的数字。


在一个长度为 n 的数组 nums 里的所有数字都在 0～n-1 的范围内。数组中某些数字是重复的，但不知道有几个数字重复了，也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

示例 1：

输入：
[2, 3, 1, 0, 2, 5, 3]
输出：2 或 3


限制：

2 &lt;= n &lt;= 100000


因为一共有n个数，每个数都在 0~n-1之间，那么可以考虑把每个数放到对应的位置上。即：nums[i]..]]></description><category></category></item><item><title><![CDATA[几道递归生成所有可能的树的问题]]></title><link>https://blog.csdn.net/chch1996/article/details/106679693</link><guid>https://blog.csdn.net/chch1996/article/details/106679693</guid><author>chch1996</author><pubDate>Thu, 11 Jun 2020 08:12:44 +0800</pubDate><description><![CDATA[1.894. 所有可能的满二叉树


满二叉树是一类二叉树，其中每个结点恰好有 0 或 2 个子结点。

返回包含 N 个结点的所有可能满二叉树的列表。 答案的每个元素都是一个可能树的根结点。

答案中每个树的每个结点都必须有 node.val=0。

你可以按任何顺序返回树的最终列表。

输入：7
输出：[[0,0,0,null,null,0,0,null,null,0,0],[0,0,0,null,null,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,null,null,nu]]></description><category></category></item><item><title><![CDATA[博弈问题]]></title><link>https://blog.csdn.net/chch1996/article/details/106660887</link><guid>https://blog.csdn.net/chch1996/article/details/106660887</guid><author>chch1996</author><pubDate>Wed, 10 Jun 2020 12:17:26 +0800</pubDate><description><![CDATA[记录leetcode中的博弈DP问题

1.292. Nim 游戏


你和你的朋友，两个人一起玩Nim 游戏：桌子上有一堆石头，每次你们轮流拿掉1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。

你们是聪明人，每一步都是最优解。 编写一个函数，来判断你是否可以在给定石头数量的情况下赢得游戏。

示例:

输入: 4
输出: false
解释: 如果堆中有 4 块石头，那么你永远不会赢得比赛；
  因为无论你拿走 1 块、2 块 还是 3 块石头，最后一块石头总是会被你的朋友...]]></description><category></category></item><item><title><![CDATA[划分K个等和子集]]></title><link>https://blog.csdn.net/chch1996/article/details/106598154</link><guid>https://blog.csdn.net/chch1996/article/details/106598154</guid><author>chch1996</author><pubDate>Sun, 07 Jun 2020 10:12:52 +0800</pubDate><description><![CDATA[698. 划分为k个相等的子集

正确解法：


class Solution {
private:
    int n;
    int target;
    bool dfs(int k, int tmpsum, int used, vector&lt;int&gt;&amp; nums)
    {
        if(k == 1) return true;
        for (int i = 0; i &lt; n; ++i)
        {
            if(used ]]></description><category></category></item><item><title><![CDATA[两道使用后序遍历的二叉搜索树问题]]></title><link>https://blog.csdn.net/chch1996/article/details/106571255</link><guid>https://blog.csdn.net/chch1996/article/details/106571255</guid><author>chch1996</author><pubDate>Fri, 05 Jun 2020 15:17:05 +0800</pubDate><description><![CDATA[1373. 二叉搜索子树的最大键值和(https://www.nowcoder.com/questionTerminal/380d49d7f99242709ab4b91c36bf2acc)


#include &lt;map&gt;
#include &lt;unordered_map&gt;
#include &lt;cstdio&gt;
#include &lt;vector&gt;
using namespace std;
 
struct TreeNode
{
    int val;
    .]]></description><category></category></item><item><title><![CDATA[前缀和]]></title><link>https://blog.csdn.net/chch1996/article/details/106383874</link><guid>https://blog.csdn.net/chch1996/article/details/106383874</guid><author>chch1996</author><pubDate>Wed, 27 May 2020 16:16:47 +0800</pubDate><description><![CDATA[记录下leetcode里关于前缀和的题目。前缀和的概念很简单， sum[i+1] = sum(a[0]...a[i])， 计算 a[i]...a[j]的和就是 sum[j+1] - sum[i]。但是暴力枚举符合条件的(i, j)对往往超时，需要结合hash表记录。

1.和为k的子数组

https://leetcode-cn.com/problems/subarray-sum-equals-k/


给定一个整数数组和一个整数k，你需要找到该数组中和为k的连续的子数组的个数。

示例 1 :

输...]]></description><category></category></item><item><title><![CDATA[区间DP]]></title><link>https://blog.csdn.net/chch1996/article/details/106340175</link><guid>https://blog.csdn.net/chch1996/article/details/106340175</guid><author>chch1996</author><pubDate>Tue, 26 May 2020 06:45:00 +0800</pubDate><description><![CDATA[1. 合并石子

https://www.nowcoder.com/questionTerminal/6d3ccbc5b6ad4f12b8fe4c97eaf969e0


有 N 堆金币排成一排，第 i 堆中有 C[i] 块金币。每次合并都会将相邻的两堆金币合并为一堆，成本为这两堆金币块数之和。经过N-1次合并，最终将所有金币合并为一堆。请找出将金币合并为一堆的最低成本。

其中，1 &lt;= N &lt;= 30，1 &lt;= C[i] &lt;= 100


输入描述:

第一行输入一个数字 N..]]></description><category></category></item></channel></rss>