摘要:
题目如下: 解题思路:“你再牛逼有什么用,写不出二叉树反转就是不行。” 所以,我们一定要会写。方法是递归,递归,递归,递归交换节点的左右节点。 代码如下: 阅读全文
摘要:
题目如下: 解题思路:如下图,只需要找出数组中所有的拐点(前后值相等也认为是拐点)。最低点分配的糖果是1个,最高点分配的糖果是max(到左边最低点的距离,到右边最低点的距离),因为次高点与最低点之间每个点分配的糖果构成公差为1的等差数列,因此很容易就能求出相邻的最高点和最低点组成的线段中所有点分配的 阅读全文
摘要:
题目如下: 解题思路:我的解法是使用两个栈,一个保存运算符,一个保存括号和数字。因为只有加减操作,所以每个数字入栈前,先判断栈顶是否是'(',如果不是,则该数字和栈顶的数字进行运算后,把原来栈顶的数字删掉,把计算的结果入栈;否则,直接入栈。如果遇到')',计算栈中所有的数字,直到遇到'('。考虑到几 阅读全文
摘要:
题目如下: 解题思路:这题和【leetcode】583. Delete Operation for Two Strings也是相似的,只不过多了一种替换的操作。具体的解析可以参考《编程之美》中的《寻找相似字符串》章节,有详细的解释。不过书中给的解法是递归,在本题会TEL,所以需要改成动态规划。如果如 阅读全文
摘要:
题目如下: 解题思路:本题和【leetcode】583. Delete Operation for Two Strings 类似,区别在于word1[i] != word2[j]的时候,是删除word1[i]还是word2[j]取决于min(dp[i-1][j]+ord(word1[i-1]),dp 阅读全文
摘要:
题目如下: 解题思路:一般这种求最大/最小的题目大多数都是用动态规划。记dp[i][j] = n 表示最少经过n次删除操作后,使得word1[0~i]与word2[0~j]相等。那么可以等到递推关系式,如果word1[i] == word2[j],那么dp[i][j] = dp[i-1][j-1]; 阅读全文
摘要:
题目如下: 解题思路:本题需要知道一个数字规律,即pow(2,n) > sum(pow(2,0)+pow(2,1)+...+pow(2,n-1))。所以,为了获得最大值,要保证所有行的最高位是1,即需要优先进行行变换,把最高位变成1。接下来就是列变换,把0多于1的列做变换变成1多于0的列即可。 代码 阅读全文
摘要:
题目如下: 解题思路:我的方案是先把S拆分成整数对,例如S='1230',先拆分成(1,230),(12,30),(123,0),然后再对前面整数对进行加小数点处理。比如(12,30)中的12可以加上小数点可以变成(12)和(1.2),(30)可以变成(30)和(3.0)。接下来对加上小数点后的结果 阅读全文
摘要:
题目如下: 解题思路:没啥好说的,用动态规划,很容易得到递推表达式: dp[m] [n]= dp[m-1][n] + dp[m][n-1]。 代码如下: 阅读全文
摘要:
题目如下: 解题思路:我的做法是建立一个字典dic,key为stone,value是一个set,里面存的是从前面的所有stone跳跃到当前stone的unit集合。例如stones=[0,1,2,3]。stone3可以从stone1跳跃两步得到或者从stone2跳跃1步得到,所有dic[3] = ( 阅读全文