- 博客(18)
- 收藏
- 关注
原创 算法概论第8章第8题
首先很显然, EXACT 4SAT 属于 NP。现在通过将 3SAT 归约到 EXACT 4SAT 来证明后者的 NP 完全性。对于任意一个 3SAT 实例,如果其中某个子句中包含了同一个文字多次,那么可以缩减为一次,如果同时包含了某个变量的肯定及否定,那么可以将这个变量去掉。然后,可以再在每个子句中可以添加一些哑变量(即没用的辅助变量),这样就可以将每个子句所包含的文字数目扩充到四个。至此,即已
2018-01-19 11:28:14
178
原创 226. Invert Binary Tree
题目大意是给出一个二叉树,让我们把它左右翻转。 思路很简单,用一个递归函数,调换两个子节点,从底部往上换。代码如下:class Solution { public TreeNode invertTree(TreeNode root) { if(root==null) return root; // Note: never forget root may be null! if(root
2018-01-17 17:51:05
149
原创 513. Find Bottom Left Tree Value
题目大意是给出一个二叉树要找出最底层的最左的叶节点。 思路很简单,用广度优先搜索,我们每次将子节点放入队列时按照右节点先进左节点后进的方法,这样子队列的最后一项就是最后一层的最左节点了。代码如下: class Solution { public int findBottomLeftValue(TreeNode root) { int result=0;
2018-01-17 16:38:46
148
原创 121. Best Time to Buy and Sell Stock
题目大意是给出一串数组表示每一天的股价,假设每天只能做买或者卖一个动作,问可以做到的最大收益是多少。 想法是利用动态规划的思想,在本题中我们可以视作每天赚上涨的差价,求最大和子串。利用两个变量分别储存当前收益和迄今为止的最大收益。代码如下: class Solution { public int maxProfit(int[] prices) { int maxCur
2018-01-13 23:14:39
151
原创 53. Maximum Subarray
题目大意是在给出的一串数组文章管理中找出一段能够产生最大的和的连续子串,返回这个最大和。 想法是通过动态规划,让原数组每一项与前面的非负和相加,产生一串和的数组,在这之中可以找到最大的和。代码如下: class Solution { public int maxSubArray(int[] A) { int n = A.length; int[] dp
2018-01-13 22:41:06
128
原创 540. Single Element in a Sorted Array
题目说,给出一串有序数组,每个数字重复两次,其中有个数字只出现一次,找出它。 想法很简单,因为每个数字都出现两次,那么用一个循环,检查偶数位的数字是否和后面的数字相同,不同则找到。代码如下: class Solution { public int singleNonDuplicate(int[] nums) { for (int i = 0; i < nums.leng
2018-01-13 21:34:10
195
原创 515. Find Largest Value in Each Tree Row
题目大意是要找出一个二叉树中每一层的最大值。 想法是,用一个BFS算法,把每层子树节点放在队列中,然后比较它们的值,找出最大的。 代码如下: class Solution { public List largestValues(TreeNode root) { Queue queue = new LinkedList(); List res = ne
2018-01-13 21:09:17
126
原创 654. Maximum Binary Tree
Given an integer array with no duplicates. A maximum tree building on this array is defined as follow: The root is the maximum number in the array.The left subtree is the maximum tree constructed f
2018-01-13 20:19:53
181
原创 682. Baseball Game
题目大意是给出我们要作为一个记分器,根据输入的字符串做出相应的加减分动作。其中普通的数字字符串给总分加上对应的分数,C代表上一个加分无效,D代表获得上一次加分的两倍分数,+代表获得上两次加分的和的分数。 思路是用一个栈来存储每一轮的分数,当普通加分时将分数加到总分里面后压入栈中;遇到+时弹出栈中的两个分数,相加后得到本轮分数,总分加上,然后依次把第二个弹出的分数、第一个弹出的分数、本轮分数压入栈
2018-01-07 23:29:59
213
原创 557. Reverse Words in a String III
题目大意是给出一串string,把里面每个单词的字母顺序颠倒过来,保留原来单词和空格的位置。 那么思路是把string转成char数组,遍历数组,遇到空格就停下,用两个游标i和j标记一个单词的范围,然后把范围内的数组元素颠倒一下,就可以得到我们要的结果。代码如下: class Solution { public String reverseWords(String s) {
2018-01-07 22:33:29
213
原创 561. Array Partition I
题意大概是给出一堆数,要让它们两两组合使它们的和从小到大排列,然后把每一组里面的最小的那个拿出来相加,返回它们的和。想法是先给这个数组排个序,然后得到从小到大的数组,那么从头开始的每两位是为一组,也就是从第一位开始每隔一位相加就是我们要的结果。代码如下: class Solution { public int arrayPairSum(int[] nums) { Arr
2018-01-07 20:51:35
142
原创 728. Self Dividing Numbers
题意是在给出的数字范围中找出自分数。所谓自分数就是能够被自己每一位上的数字整除的数。其实这也是比较简单的。需要注意的点就是如果数字里面有零就不是自分数,因为零不能是除数。想法就是建立一个list,把从左往右依次查找,判断它是否是自分数,是就放到list里面,最后返回这个表。代码如下: class Solution { public List selfDividingNumbers(int
2018-01-07 19:55:57
181
原创 647. Palindromic Substrings
题意是给出一个字符串,从里面找出回文子串的数目。 思路是定义一个计数器count=0,用一个循环,从第i位开始向左右两边一位匹配,匹配到一次就count++,然后分别再向左右两边扩大一位匹配,直到匹配不到或者到达左右两个中的一个。因为回文的奇数和偶数的匹配有区别,所以每一位要从第i位匹配一次,从i到i+1匹配一次。 代码: public class Solution { int count
2017-10-29 21:19:54
198
原创 495. Teemo Attacking
题意是提莫的攻击会造成中毒效果,中毒效果会持续duration时间,提莫会在timeSeries中的时间点发动攻击。当目标处于中毒状态的时候提莫进行攻击会刷新目标的中毒效果持续时间。我们需要写一个程序来计算目标的中毒总时间。 思路很简单,我们初始化一个totaltime=0来存储总时间。然后做一个循环,次数为数组长度-1,如果现在的时间点与下一个时间点的时间差大于中毒的持续时间,那么totalt
2017-10-29 19:25:54
212
原创 547. Friend Circles
题目会给出一个n*n二维数组,表示n个人之间的朋友关系。1为互为朋友,0为不是朋友。现在我们要找出朋友圈的最大数目。 这道题用到DFS算法。我们用一个循环,从第一个人开始找,用深度优先搜索找出和他有朋友关系的人,形成一个朋友圈,然后给他们都打上标签,表示我们已经遍历过他们,下一次循环不再遍历他们。然后循环找到下一个没有遍历过的人,从他开始构建一个朋友圈,直到所有人被遍历。 代码如下: cla
2017-10-29 17:36:45
266
原创 657. Judge Route Circle
题意:判断机器人在经过UDLR操作之后是否回到原点? 解决思路:构建坐标系,Up就x+1,Down就x-1,Left就y+1,Right就y-1,最后判断x和y是不是都是0。 代码: bool judgeCircle(string moves) { int x = 0; int y = 0; for (char c : moves) { if (c == 'U') { x++
2017-09-24 23:52:08
203
原创 27. Remove Element
题意:给一个数组,把给定值相同的元素去掉,然后返回处理后的数组长度。不能开新的数组。处理后的数组在处理后的长度内需要按照原来的顺序排列,题目不关心长度外的数组元素。 思路:使用一个计数器count,扫描整个数组,当元素等于给定值时count+1,否则将当前元素放到count个位置前,模拟把元素拿掉并将后面元素往前推的过程。 源代码如下: int removeElement(vector& n
2017-09-17 19:27:15
209
原创 13. Roman to Integer
要求写一个子程序实现输入一串罗马数字返回它代表的阿拉伯数字。实现思路是:使用一个map来将字母和数字联系起来,通过字母索引可以找到对应的数字,然后根据罗马数字的表示形式,从字符串后向前扫描如果前面的小于后面的则和减去前面的,否则加上前面的。 代码如下: #include #include #include class Solution { public: int romanToInt(
2017-09-09 20:59:57
142
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅