<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[markpen的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/markpen</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; markpen]]></copyright><item><title><![CDATA[Leetcode Longest Substring with At Most K Distinct Characters]]></title><link>https://blog.youkuaiyun.com/markpen/article/details/71157306</link><guid>https://blog.youkuaiyun.com/markpen/article/details/71157306</guid><author>markpen</author><pubDate>Thu, 04 May 2017 01:46:07 +0800</pubDate><description><![CDATA[题意：找出最长的含k个不同字符的子串的长度。
思路：windows slide
class Solution {
public:
    int lengthOfLongestSubstringKDistinct(string s, int k) {
        if(k < 1) return 0;
        
        vector alpha(128, 0);
     ]]></description><category></category></item><item><title><![CDATA[Leetcode Integer Replacement]]></title><link>https://blog.youkuaiyun.com/markpen/article/details/69664701</link><guid>https://blog.youkuaiyun.com/markpen/article/details/69664701</guid><author>markpen</author><pubDate>Sat, 08 Apr 2017 08:59:14 +0800</pubDate><description><![CDATA[题意：遇到偶数除以2，奇数 +1 或者 - 1。看多少次后能达到1。
思路：BFS。
class Solution {
public:
    int integerReplacement(int n) {
        pair addNode;
        addNode.first = n, addNode.second = 0;
        node.push_back(ad]]></description><category></category></item><item><title><![CDATA[Leetcode Jump Game II]]></title><link>https://blog.youkuaiyun.com/markpen/article/details/68955565</link><guid>https://blog.youkuaiyun.com/markpen/article/details/68955565</guid><author>markpen</author><pubDate>Mon, 03 Apr 2017 01:28:33 +0800</pubDate><description><![CDATA[题意：给出从当前节点能跳的最大步数，求最少要跳多少步能到达终点。
思路：枚举跳的步数，用BFS实现。
class Solution {
public:
    int jump(vector& nums) {
        if(nums.size() < 2) return 0;
        
        int step = 0, maxJump = 0, next = 0;
 ]]></description><category></category></item><item><title><![CDATA[Leetcode Reconstruct Itinerary]]></title><link>https://blog.youkuaiyun.com/markpen/article/details/68063002</link><guid>https://blog.youkuaiyun.com/markpen/article/details/68063002</guid><author>markpen</author><pubDate>Wed, 29 Mar 2017 12:13:25 +0800</pubDate><description><![CDATA[题意：给出一个有向图，求出一条欧拉通路。
思路：求欧拉通路。DFS 和后序遍历。
class Solution {
public:
    vector findItinerary(vector> tickets) {
        if(tickets.size() == 0) return re;
        
        for(int i = 0; i < tickets.s]]></description><category></category></item><item><title><![CDATA[Leetcode Count of Range Sum]]></title><link>https://blog.youkuaiyun.com/markpen/article/details/67634410</link><guid>https://blog.youkuaiyun.com/markpen/article/details/67634410</guid><author>markpen</author><pubDate>Tue, 28 Mar 2017 12:29:14 +0800</pubDate><description><![CDATA[题意：求连续和在区间内的和的个数。
思路：分治，利用归并排序的思想，分成前后两部分。如果sumb [L] - suma[I] > upper sumb[K] - suma[I] > lower，那么L - K之间的和都满足要求。
class Solution {
public:
    int countRangeSum(vector& nums, int lower, int upper) ]]></description><category></category></item><item><title><![CDATA[Leetcode Maximum XOR of Two Numbers in an Array]]></title><link>https://blog.youkuaiyun.com/markpen/article/details/67162818</link><guid>https://blog.youkuaiyun.com/markpen/article/details/67162818</guid><author>markpen</author><pubDate>Tue, 28 Mar 2017 00:44:06 +0800</pubDate><description><![CDATA[题意：给出一列数组，求出其中两个数字异或的最大值。
思路：这题的思路很巧妙，枚举了每个位上的数字。又利用的异或的性质。
class Solution {
public:
    int findMaximumXOR(vector& nums) {
        int mask = 0;
        int re = 0;
        for(int i = 31; i >=0; -]]></description><category></category></item><item><title><![CDATA[Leetcode Find K Pairs with Smallest Sums]]></title><link>https://blog.youkuaiyun.com/markpen/article/details/66968196</link><guid>https://blog.youkuaiyun.com/markpen/article/details/66968196</guid><author>markpen</author><pubDate>Mon, 27 Mar 2017 09:48:13 +0800</pubDate><description><![CDATA[题意：给出两个排好序的数组，求出前k个和最小的数对。
思路：归并排序的归并思路，每次取最小的数对。
class Solution {
public:
    vector> kSmallestPairs(vector& nums1, vector& nums2, int k) {
        vector> mp;
        for(int i = 0; i < nums1.size]]></description><category></category></item><item><title><![CDATA[Leetcode Maximum Product of Word Lengths]]></title><link>https://blog.youkuaiyun.com/markpen/article/details/66950987</link><guid>https://blog.youkuaiyun.com/markpen/article/details/66950987</guid><author>markpen</author><pubDate>Mon, 27 Mar 2017 04:47:09 +0800</pubDate><description><![CDATA[题意：给出一列单词，求出两个单词长度之积的最大值，要求这两个单词没有重复的字母。
思路：关键在于如何快速判断两个单词没有相同的字母。这里用到了位运算，将单词看作是字母的集合，用位运算快速求出交并补的结果。
class Solution {
public:
    int maxProduct(vector& words) {
        vector w(words.size(), 0);]]></description><category></category></item><item><title><![CDATA[Leetcode Binary Watch]]></title><link>https://blog.youkuaiyun.com/markpen/article/details/61545751</link><guid>https://blog.youkuaiyun.com/markpen/article/details/61545751</guid><author>markpen</author><pubDate>Sun, 12 Mar 2017 02:42:40 +0800</pubDate><description><![CDATA[题意：手表用二进制显示时间，给出亮灯的个数，求可能的时间。
思路：枚举子集的个数。这里数量较小，直接用二进制枚举。
class Solution {
public:
    vector readBinaryWatch(int num) {
        vector h(4, 1);
        for(int i = 1; i < h.size(); i ++ ) {
       ]]></description><category></category></item><item><title><![CDATA[Leetcode Find Median from Data Stream]]></title><link>https://blog.youkuaiyun.com/markpen/article/details/61413260</link><guid>https://blog.youkuaiyun.com/markpen/article/details/61413260</guid><author>markpen</author><pubDate>Sat, 11 Mar 2017 09:35:33 +0800</pubDate><description><![CDATA[题意：找出一列数组中的中位数。
思路：使用multiset，并维护一个指针，指向中位数，根据新加入的数的大小来向左向右移动指针。
class MedianFinder {
public:
    /** initialize your data structure here. */
    MedianFinder() {
        mid = INT_MIN;
        cout]]></description><category></category></item><item><title><![CDATA[Leetcode Evaluate Division]]></title><link>https://blog.youkuaiyun.com/markpen/article/details/61407256</link><guid>https://blog.youkuaiyun.com/markpen/article/details/61407256</guid><author>markpen</author><pubDate>Sat, 11 Mar 2017 08:19:03 +0800</pubDate><description><![CDATA[题意：在已知一系列方程的条件下，求另一些方程的值。题目保证方程不会冲突。
思路：将方程归类，有关联的归到一类。这部分用并查集实现。按一定顺序求解方程，这里用了变量名的字典序。
class Solution {
    struct eq {
        string nums;
        string divs;
        double val;
    };
public:
]]></description><category></category></item><item><title><![CDATA[Leetcode Minimum Window Substring]]></title><link>https://blog.youkuaiyun.com/markpen/article/details/60765002</link><guid>https://blog.youkuaiyun.com/markpen/article/details/60765002</guid><author>markpen</author><pubDate>Tue, 07 Mar 2017 15:11:58 +0800</pubDate><description><![CDATA[题意：给出一个字符串，求出其子串中包含能组成给定字符串的最短子串。
思路：先用hash map判断是否包含。枚举以每个字母结尾的子串。用一个指针指向该子串的启示位置。
class Solution {
public:
    string minWindow(string s, string t) {
        string temps = "";
        map testa;]]></description><category></category></item><item><title><![CDATA[Leetcode Minimum Size Subarray Sum]]></title><link>https://blog.youkuaiyun.com/markpen/article/details/60762356</link><guid>https://blog.youkuaiyun.com/markpen/article/details/60762356</guid><author>markpen</author><pubDate>Tue, 07 Mar 2017 13:47:15 +0800</pubDate><description><![CDATA[题意：找出最短的连续数列，使其各项之和大于给定值。
思路：先判断是否存在这样的数列。枚举以每一个元素结尾的满足条件的最短数列，枚举的时候保持一个指针，指向满足条件数列开始的位置。
class Solution {
public:
    int minSubArrayLen(int s, vector& nums) {
        vector  p(nums.size(), -1);
 ]]></description><category></category></item><item><title><![CDATA[Leetcode Surrounded Regions]]></title><link>https://blog.youkuaiyun.com/markpen/article/details/60761259</link><guid>https://blog.youkuaiyun.com/markpen/article/details/60761259</guid><author>markpen</author><pubDate>Tue, 07 Mar 2017 12:56:36 +0800</pubDate><description><![CDATA[题意：将被包围的O改成X。
思路：按边深度搜索。
class Solution {
public:
    int h, w;
    void solve(vector>& board) {
        h = w = 0;
        h = board.size();
        if(h) w = board[0].size();
        for(int i = 0]]></description><category></category></item><item><title><![CDATA[Leetcode Best Time to Buy and Sell Stock with Cooldown]]></title><link>https://blog.youkuaiyun.com/markpen/article/details/59483509</link><guid>https://blog.youkuaiyun.com/markpen/article/details/59483509</guid><author>markpen</author><pubDate>Thu, 02 Mar 2017 11:30:07 +0800</pubDate><description><![CDATA[题意：给出每个时刻股票的价格，每天只能买入或卖出，买入或卖出后第二天不能交易。
思路：DP，dp[i][j] 表示在第i天买入，第j天卖出的最大利润，转态方程为：dp[i][j] = max(dp[i][j - 1],  max(dp[i - 2][k])。
class Solution {
public:
    int maxProfit(vector& prices) {
       ]]></description><category></category></item><item><title><![CDATA[Leetcode Minimum Absolute Difference in BST]]></title><link>https://blog.youkuaiyun.com/markpen/article/details/59407060</link><guid>https://blog.youkuaiyun.com/markpen/article/details/59407060</guid><author>markpen</author><pubDate>Thu, 02 Mar 2017 06:01:19 +0800</pubDate><description><![CDATA[题意： 找出一棵数中， 各结点之差绝对值的最小值。
思路：dfs遍历，排序后，比较相邻元素的之差绝对值的大小。
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(]]></description><category></category></item><item><title><![CDATA[Leetcode Subsets II]]></title><link>https://blog.youkuaiyun.com/markpen/article/details/54628453</link><guid>https://blog.youkuaiyun.com/markpen/article/details/54628453</guid><author>markpen</author><pubDate>Fri, 20 Jan 2017 04:12:56 +0800</pubDate><description><![CDATA[题意：找到一个集合所有不一样的子集。
思路：暴力搜索。排序之后判断两个集合是否一样。
class Solution {
public:
    vector> subsetsWithDup(vector& nums) {
        int mark = pow(2.0, nums.size());
        vector in;
        int iniin = 1;]]></description><category></category></item><item><title><![CDATA[Leetcode Count of Smaller Numbers After Self]]></title><link>https://blog.youkuaiyun.com/markpen/article/details/54570877</link><guid>https://blog.youkuaiyun.com/markpen/article/details/54570877</guid><author>markpen</author><pubDate>Mon, 16 Jan 2017 08:14:03 +0800</pubDate><description><![CDATA[题意：给出一组数字，求出在每个数字之后比这个数小的数字的个数。
思路：这题用了分治的思想。将数组分成前后两部分来做，每一部分分别求出答案。在合并的时候，记录由后面的数组移动到前面的数组的数字的个数，这个数就是后面数组中比前面数组中比某个数小的数的个数。
class Solution {
public:

struct mynode {
    int val;
    int pos;
   ]]></description><category></category></item><item><title><![CDATA[Leetcode Queue Reconstruction by Height]]></title><link>https://blog.youkuaiyun.com/markpen/article/details/54561847</link><guid>https://blog.youkuaiyun.com/markpen/article/details/54561847</guid><author>markpen</author><pubDate>Sun, 15 Jan 2017 14:45:38 +0800</pubDate><description><![CDATA[题意：给出每个人的身高和前面高于或者等于自己身高的人的个数，重排列这个队伍。
思路：先从身高较高的人入手，因为他们的限制是最小的，在他们中间插入身高较矮的人对结果没有影响。因此先将他们按身高降序排序，如果身高一样则按人数升序排序。最后一个一个插入，人数即是他们在队列中的新位置。
顺序遍历插入：
class Solution {
public:
    vector> reconstructQ]]></description><category></category></item><item><title><![CDATA[Leetcode Move Zeroes]]></title><link>https://blog.youkuaiyun.com/markpen/article/details/54405268</link><guid>https://blog.youkuaiyun.com/markpen/article/details/54405268</guid><author>markpen</author><pubDate>Fri, 13 Jan 2017 08:25:00 +0800</pubDate><description><![CDATA[题意：将所有的）移动到数组最后，其他元素保持不变。
思路：记录连续0开始的位置，将非零数不断与首个0交换，直到所有0都再尾部。
class Solution {
public:
    void moveZeroes(vector& nums) {
        for(int i = 0, j = -1; i < nums.size(); ++ i) {
            if(nu]]></description><category></category></item></channel></rss>