<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>算法 on 日日是好日-我的生活记录</title>
    <link>http://www.ririshihaori.com:80/categories/%E7%AE%97%E6%B3%95/</link>
    <description>Recent content in 算法 on 日日是好日-我的生活记录</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Tue, 03 Dec 2019 00:23:55 +0800</lastBuildDate>
    <atom:link href="http://www.ririshihaori.com:80/categories/%E7%AE%97%E6%B3%95/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>[持续更新]Leetcode刷题笔记</title>
      <link>http://www.ririshihaori.com:80/posts/2019/12/leetcode%E5%88%B7%E9%A2%98%E7%AC%94%E8%AE%B0/</link>
      <pubDate>Tue, 03 Dec 2019 00:23:55 +0800</pubDate>
      <guid>http://www.ririshihaori.com:80/posts/2019/12/leetcode%E5%88%B7%E9%A2%98%E7%AC%94%E8%AE%B0/</guid>
      <description>&lt;p&gt;　　&lt;/p&gt;&#xA;&lt;h2 id=&#34;1位运算与比较运算的优先级&#34;&gt;1.位运算与比较运算的优先级&lt;/h2&gt;&#xA;&lt;p&gt;　　&lt;a href=&#34;https://leetcode-cn.com/problems/can-i-win/&#34;&gt;题号464，我能赢吗&lt;/a&gt;，两人轮流从给出的等差数列中取数（数列从1开始直到n，n为给出的值），取出的数之和超过某个给出的目标值游戏结束，最后一个取数的人胜利。&#xA;作法主要是用递归模拟两个人的取数过程（因为假设两个人都足够聪明），用位运算模拟取数顺序（即两个人取数的情况一共有2^n种），由于题目规定n最大不超过20所以用一个数组来存所有可能的取数情况下的游戏结果。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-C++&#34; data-lang=&#34;C++&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; dp[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; n] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;　　按照这个思路实现了以后还是执行不对，debug最后发现是位运算和比较运算的优先级问题。问题出在这行代码：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-C++&#34; data-lang=&#34;C++&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (stat &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; select &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;　　==和!=的优先级高于&amp;amp;运算符，改成&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-C++&#34; data-lang=&#34;C++&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; ((stat &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; select) &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;　　就好了。&lt;/p&gt;&#xA;&lt;p&gt;　　(另外说到用位来存情况就想到了之前走心群里遇到的一道高中排列组合题，题目是10颗一样的糖，每天至少吃一颗，一共有几种吃法？&#xA;泉哥的答案：C9_0 + C9_1 +&amp;hellip;+ c9_9=2^9，(至今没想明白为啥= =)&#xA;网上看到另一种思路：把10颗糖从左向右排成一列，第1天一定会吃第1颗糖，将它记为1，如果接下来的一颗糖和前一颗糖在同一天吃，就把这颗糖记为和前一颗糖相同的数字，即前一颗为1这一颗也为1，前一颗为0这一颗也为0，这样这列糖就可以表示为一个首位为1的10位二进制数，这样的数一共有2^9=512个，即为512种吃法。二进制真奇妙。&amp;#x1f606;)&lt;/p&gt;&#xA;&lt;h2 id=&#34;2双指针法解决链表问题&#34;&gt;2.双指针法解决链表问题&lt;/h2&gt;&#xA;&lt;h3 id=&#34;环形链表&#34;&gt;环形链表&lt;/h3&gt;&#xA;&lt;p&gt;　　检查链表有没有环推荐双指针法，因为具有O(1)的空间复杂度，也可以用其他方法比如哈希表法或者集合大小法。 &lt;br&gt;&#xA;　　&lt;a href=&#34;https://leetcode-cn.com/problems/linked-list-cycle-ii/&#34;&gt;环形链表Ⅱ题号142&lt;/a&gt;，双指针法的算法步骤（题解里已经有数学证明）（前半部分和环形链表Ⅰ的解法相同）：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;设置一快一慢两个指针，slow移动一下fast移动两下。若&lt;code&gt;fast == nullptr&lt;/code&gt;说明无环，若&lt;code&gt;fast == slow&lt;/code&gt;说明fast &lt;strong&gt;套圈&lt;/strong&gt; 了slow，链表存在环。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;此时将fast置为head，slow维持不变，然后两指针分别同时移动，相遇点即为成环点。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;相交链表&#34;&gt;相交链表&lt;/h3&gt;&#xA;&lt;p&gt;　　&lt;a href=&#34;https://leetcode-cn.com/problems/intersection-of-two-linked-lists/&#34;&gt;相交链表&lt;/a&gt;也可以用双指针法解决，具体做法：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;分别设置两个指针p1p2，从两个头结点headA和headB处开始遍历。&lt;/li&gt;&#xA;&lt;li&gt;若p1遍历到headA所在链表的结尾，则把p1设置为headB，继续遍历；若p2遍历到headB所在链表的结尾，则把p2设置为headA继续遍历。&lt;/li&gt;&#xA;&lt;li&gt;两指针相遇点即为相交点。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;　　原理很简单，设A、B两个链表不相交的部分分别为a、b，相交部分为merge，则&lt;code&gt;a + merge + b = b + merge + a&lt;/code&gt;，等号两侧分别为两个指针按照顺序走过的路径相加，因此相遇点就是相交点。&lt;/p&gt;&#xA;&lt;h2 id=&#34;3powxn&#34;&gt;3.Pow(x,n)&lt;/h2&gt;&#xA;&lt;p&gt;踩坑过程:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;-&amp;gt; 直接递归调用自身     &#xA;-&amp;gt; 一些例子导致栈溢出     &#xA;-&amp;gt; 改用循环处理       &#xA;-&amp;gt; ｎ可能为负数没考虑到        &#xA;-&amp;gt; ｎ为负数时，ｎ变成-n，x变为1/x       &#xA;-&amp;gt; 一些例子会报错： `runtime error: negation of -2147483648 cannot be represented in type &#39;int&#39;`，问题出在n变为-n时，正数和负数的最大表示范围不一样。         &#xA;-&amp;gt; 用long long类型变量N代替n：`long long N = n;`    &#xA;-&amp;gt; 2.00000 -2147483648的例子还是会超出时间限制 感受到了深深的恶意      &#xA;-&amp;gt; 向题解低头，用二分递归实现，简洁优雅卧槽&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;最终代码：&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
