LeetCode
文章平均质量分 63
Azure10dai
这个作者很懒,什么都没留下…
展开
-
Single Number I:用异或操作在线性时间寻找
原题地址:https://leetcode.com/problems/single-number/#/description题目要求无额外空间和线性时间,所以另外拿数组记录是不可行的,想到异或操作有以下特性:1. 0^N=02. N^N=0;3. N1^N2^N3=N3^N1^N2(结合性)因此只需要逐个异或最后留下来的必是只出现过一次的数字。C++:class S原创 2017-03-28 08:44:55 · 530 阅读 · 0 评论 -
House Robber II
前情提要:House Robber I原题地址:点我传送根据前面的思路,成圈后的问题在于最后一个的取舍与第一个的取舍有关,这样考虑:若抢第一个,则最后一个不能抢,倒数第二个和第一个的取舍独立,这就是第一题的情况,同样,若不抢第一个,则第二个与最后一个的取舍独立,同样是第一题的情况,因此可以解答。Java:public class Solution { static publ原创 2017-04-21 01:02:54 · 322 阅读 · 0 评论 -
Triangle
原题地址:点我传送首先想,最短路径的选择是从顶端发散到底端的,换言之,就是从底端聚集到顶端的。所以对底部的每一个数都有一个最短路径,其中的最短值即为所求。对每一个最短路径有这样的状态转移:即ans[i] = min(ans[i],ans[i+1])+triangle[row][i]ans[i]是对该层第几个值而言由下向上追溯的最短路径值,它是之前(即下层)的左右值分别与它所在的矩阵中的原创 2017-04-21 01:57:14 · 407 阅读 · 2 评论 -
Jump Game
原题地址:点我传送还是需要从后往前的想法,让last成为最后一个能到达的地方,看last能不能最后推回到0。Java:public class Solution { public boolean canJump(int[] nums) { int last = nums.length-1; for(int i=nums.length-2;i>=0原创 2017-04-21 02:12:38 · 263 阅读 · 0 评论 -
Gas Station
原题地址:点我传送对这个圈做遍历,从该点出发,对每到一个点,计算剩余汽油量remain,如果remain小于0则说明不能往下走了,此时remain同时表示从出发点到这里的下一个点的汽油消耗量,要进行另外一次新的出发,出发点应是此时的点往后一个(即下一个点),因为中间肯定是行不通的。remainCost再加上此时的remain就是出发点0到这里的下一个点所消耗的总汽油量了。设定好新出发点(i+1原创 2017-04-21 02:31:53 · 391 阅读 · 0 评论 -
01 Matrix
原题地址:点我传送有想法是用广度优先做,但是感觉可能会太耗时间,就想按顺序遍历,给每个1取临近的1的距离值+1中最小的,如果临近有0则距离必为1最小(实际上这样访问的只能是左边和上面的1,因为后面的1的距离值还没有算出来)。但是这样会有一个问题,即后面出现临近的0时右边或者下面的与新出现的0临近的点的距离值还没有算出来,无法给当前算的距离值提供,而此时新出现的0可能会带来更小的距离值。于是就再原创 2017-05-03 23:12:41 · 424 阅读 · 0 评论 -
Hamming Distance
原文地址:点我传送题目要求计算不同位的个数,那只要异或再求1的位数即可。利用java的 Integer.toBinaryString(int) 可以很方便的进行整数到二进制字符串的转换。Java:public class Solution { public int hammingDistance(int x, int y) { String temp = Int原创 2017-03-30 19:09:15 · 282 阅读 · 0 评论 -
Unique Paths II
原题地址:点我传送一道动态规划的题目,看到一个花了挺长时间解决的算法,就是用数组ans[m]来记录按行(i)遍历时每一行当前对应的那个点(i,j)所拥有的经过路径。如果是1(障碍)则为0,否则它是它上面那个点所拥有的路径(ans[j],此时未更新)+它左边那个点的路径(ans[i-1])。最后的ans[m-1]就是计算到最后一行时最后一列的那个点(即终点)的答案。原解释:let原创 2017-05-15 22:41:16 · 244 阅读 · 0 评论 -
Combination Sum
原题地址:点我传送就是一个要慢慢构造出来的办法,但是感觉自己对算法还是不够熟,构造的过程有很多问题,参考了别人构造的解法。构造是这样完成的:记录一个begin初始为0作为构造起点,从begin的数开始,如果比target小,就把它加进来,然后再从begin开始构造(此时为一个递归),target变成target减去刚刚加进去的数。最后如果target==0(即构造完成)把它加进去ans里。原创 2017-05-15 23:41:44 · 368 阅读 · 0 评论 -
Implement Trie (Prefix Tree)
原题地址:点我传送思路是这样的:设计一个这样的结构体,一个节点有26个指向其他节点的指针,同时有一个值记录这个节点是否是按这个字符串查找下来的最后一个值。加入字符串时将每个字符串从头开始,根节点的第(字符-‘a’)个指针指向了一个新的节点,以此类推,最后那个节点设置记录值。搜索时也是如此,从头开始,如果这个指针不为空,则往下按字符查找,查找到最后的那个节点要有记录值才是查找成功。C++原创 2017-05-16 01:08:01 · 319 阅读 · 0 评论 -
Longest Substring Without Repeating Characters
原题地址:点我传送这道题的思路还是比较简单的(但是要用到哈希容器),用一个哈希表记录在字符串中某个字符出现的最后一次的位置,并用两个值记录当前无重复字符字串的头和尾。然后从头遍历到尾的时候如果有已出现的字符,则更新当前记录的字串的首部到该字符上次出现的下一位和当前首部的较大值,另外还要更新哈希表和最长字串长度。Java:public class Solution { pub原创 2017-04-25 19:39:49 · 299 阅读 · 0 评论 -
Coin Change
原题地址:点我传送本来想用之前那个构造和的方法做,但是那个方法还保留了构造的过程,会超时。就只能退而用dp做。(其实是一开始没想到好吗)此时用ans[i]数组表示需要的amount为i时的解。显然0时解为0.后面对于每个i,对每个硬币,如果硬币值小于所需值,则可以拿。拿与不拿两种情况取小即可。C++:class Solution {public: int coinChan原创 2017-06-01 17:42:11 · 435 阅读 · 0 评论 -
Unique Binary Search Trees
原题地址:点我传送一开始完全不知道从何下手,想用动态规划也找不到地方。找了资料发现可以这样想:对一个序列1~n,每个点可以做根节点,接下来分成两边就是子问题的求解。那么用ans[i]表示n=i时的解,则显然ans[i]是由1~i的每个点做根节点的两部分的解之积的和。不难有代码。C++:class Solution {public: int numTrees(int n) {原创 2017-06-01 18:00:11 · 304 阅读 · 0 评论 -
Wiggle Subsequence
原题地址:点我传送思路是从第一个差开始,如果前面的大,那就找比当前数更大的,然后反转。前面的小同理,注意排查一些特殊情况。C++:class Solution {public: int wiggleMaxLength(vector& nums) { int n = nums.size(); if(n<2) {原创 2017-06-01 19:02:42 · 338 阅读 · 0 评论 -
Maximal Square
原题地址:点我传送要找一个最大的全1正方形,假设它的右下方点的坐标为i,j。P(i,j)表示它做左上范围内的矩阵包含的最大全1正方形的长(宽),则显然P(i,j)是它左,上,左上三个点P值的最小值 + 1。但若此时该点为0,则P=0。最后最大的P就是解。C++:class Solution {public: int maximalSquare(vector>& matrix)原创 2017-06-01 20:43:16 · 422 阅读 · 0 评论 -
House Robber
原题地址:点我传送动态规划的题目,每次这样的题目一开始都想不到怎么做......用两个变量来记录答案,分别是不抢前面最后一间房(norob)和抢前面最后一间房(rob)的值。对每一个房间,如果要抢,那rob就会更新到norob+该房间的钱(因为不能连续抢),如果不抢,能norob就可以更新到上一个rob(因为过了一个房间)和本身的最大值。最后答案是对最后一个房抢和不抢情况的最大值,即最原创 2017-04-21 00:32:21 · 397 阅读 · 0 评论 -
Island Perimeter
原题地址:点我传送看上去第一时间想的可能有些复杂,后来想到用两个数组来代表水平和垂直的线,对每一个属于小岛的格子,测试它的四周,如果是水就将与那一个相邻的那条边加入到岛边,否则就不是岛边。其实可以直接计数,但为了更好理解先用数组记录下来,最后再计数。对于类似这种问题,测试四周都是很经典的想法。Java:public class Solution { public int isl原创 2017-04-17 15:44:26 · 322 阅读 · 0 评论 -
Max Consecutive Ones
原题地址:点我传送很简单,一次遍历并计数就可以了。Java:public class Solution { public int findMaxConsecutiveOnes(int[] nums) { int count = 0; int max = 0; for(int x: nums) {原创 2017-04-13 15:27:30 · 395 阅读 · 0 评论 -
Single Number II:寻求一个Single Number的问题通解
原题地址:点我传送之前做过的那道题由于其他数字只出现过2次,用异或操作的特殊性就可以消除,但是3次,4次呢?此时还是要按照二进制数的思路走,只要对每一个数的32位逐位计数,3个1就是0,最后按位或给结果即可。Java:public class Solution { public int singleNumber(int[] nums) { int ans =原创 2017-03-28 08:59:11 · 330 阅读 · 0 评论 -
Single Number III:两个Single Number问题
前情提要:Single Number I Single Number II 原题地址:Single Number III由于有两个所求数,所以要做两个操作:首先将全体数异或得到temp,temp中的set位是两个答案不同的位,接下来按此位将nums分成两部分各自异或即可得两个Single Number。Java:public class Solution {原创 2017-03-28 09:17:50 · 357 阅读 · 0 评论 -
Number of 1 Bits
原题地址:点我传送由于java里面是没有unsigned类型的,因此考虑用了另外的思路去做,还是和之前一样想到二进制数,每次看最低位同时移位,当为0时即可表示为结束。注意>>>的右移是零位扩展。public class Solution { // you need to treat n as an unsigned value public int hammingWei原创 2017-03-30 19:06:27 · 256 阅读 · 0 评论 -
Counting Bits
原文地址:点我传送一道挺有趣的题目,逐个计算是没什么难度的,但如果要时间复杂度在O(n)就要动下脑子,不难发现规律即每从一个2^n数开始接下来的2^n个数,其1的个数都是每位下标减去2^n再+1得到的。例如:0:01:12-3:1(0+1) 2(1+1)4-7:1(0+1) 2(1+1) 2(1+1) 3(2+1)8-15:1(0+1) 2(1+1) 2(1+1) 3(2+原创 2017-03-30 19:48:40 · 241 阅读 · 0 评论 -
Nim Game
原题地址:点我传送又是一道游戏题,对于所有类似的问题,都是从找必胜法入手。如这个游戏,只要小于等于3必然是可以赢的,4的时候必输。那么567的时候必胜,因为可以把必负局面留给对手,这样下去不难发现,只要是4的倍数,就是必负,否则必胜。Java:public class Solution { public boolean canWinNim(int n) { re原创 2017-04-10 15:05:53 · 399 阅读 · 0 评论 -
Add Two Numbers II
原题地址:点我传送比之前的Add Two Numbers I更进一步,这次链表给的是直接按最高位到最低位的顺序,稍微加大了些难度,但是想到类似的结构应该是栈,将两个链表分别存进栈里后再取出来相加,答案再入栈,最后再从答案栈中构建链表,即满足题目要求。Java:/** * Definition for singly-linked list. * public class ListNo原创 2017-04-10 15:31:15 · 272 阅读 · 0 评论 -
Remove Nth Node From End of List
原题地址:点我传送挺有意思的一道题,要删除链表中的倒数第n个值。最简单的就是直接一次循环找到末尾,然后再一次循环到倒数第n-1个删除即可。但是这样做难免给人浪费的感觉,其实只用一次循环也可以做成。只需要使用两个指针,一个是先从头指针出发往后n-1个的位置,另一个则是头指针开始。当走在前面的指针到末端时,后面的指针跳过一个位置就把那个位置即倒数第n个值给删除了。但这样做的问题是删除第一个和最原创 2017-04-01 12:43:32 · 255 阅读 · 0 评论 -
Search Insert Position
原题地址:点我传送很简单的一道题,对数组里的每一个数,比较小的就下一个,大的或者等于的就是所求位置。到最后了就是在尾部插入。Java:public class Solution { public int searchInsert(int[] nums, int target) { for(int i=0;i<nums.length;i++) {原创 2017-04-01 12:50:01 · 238 阅读 · 0 评论 -
Climbing Stairs
原题地址:点我传送不难想到其实就是斐波那契数列,因为只有1或2步两种走法,其实就是n-1的走法和n-2的走法之和(要么最后一步是1,要么最后一步是2)。实现的话直接递归真的超慢会超时的(自己可以试试输入1~50,后面每个答案出来都会很慢),所以干脆先算出一些存进数组里再递归就好了。更简单就是打表一部分。Java:public class Solution { public原创 2017-04-01 13:05:39 · 259 阅读 · 0 评论 -
Same Tree
原题地址:点我传送要判断两个树是否一样,判断根节点后再判断左子树和右子树情况的与就好了。注意到这个判断是逻辑短路的。Java:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right;原创 2017-04-01 13:09:42 · 292 阅读 · 0 评论 -
Best Time to Buy and Sell Stock
原题地址:点我传送贪心算法,遍历数列的每两个数的差取最大即可。C++:class Solution {public: int maxProfit(vector& prices) { int diff = 0; for(int i = 0; i < prices.size(); i++) { fo原创 2017-04-01 13:12:12 · 328 阅读 · 0 评论 -
Merge Two Sorted Lists
原题地址:点我传送这其实就是归并算法的归并一步。思想就是两个链表从头开始,每次比较小的往里面塞,到一个链表尽头后将另一个表的后面全部放到所求表的后面即可。比较麻烦的是所求表ans开辟空间是先开辟在放数,所以一定要确定有即将插入的值时才开辟一个新的空间,否则就会多出一个“0”。C++:/** * Definition for singly-linked list. * struc原创 2017-04-01 13:16:55 · 301 阅读 · 0 评论 -
Most Frequent Subtree Sum
原题地址:点我传送指向很明确,就是要用map容器,或者是做哈希表,思想都一样,java这方面还不是很熟,先用的C++来做。首先明确肯定是后序遍历计算sum,然后让sum对应的count++,并与记录最大值的maxCount比较。最后再遍历整个map容器,count==maxCount的就可以放进ans向量里。注意传递要使用按引用传递。C++:/** * Definition fo原创 2017-04-10 23:54:13 · 350 阅读 · 0 评论 -
Friend Circles
原题地址:点我传送本质上是对一个领接矩阵做一个图的广度优先遍历,对每一个点,如果之前已经被遍历过,那么就已经存在于一个朋友圈中,无需再遍历。如果没有,则广度优先遍历并记录。最后的count便是答案。C++:class Solution {public: int findCircleNum(vector>& M) { int count = 0;原创 2017-04-11 09:46:14 · 388 阅读 · 0 评论 -
2016/10/20 1002. 字符串匹配
本质上就是一个KMP算法的题目,核心就是算出next数组,之后的匹配就简单了。next的算法是在书上找到的。(到处都有)#include #include using namespace std;int main(){ int n; while (cin >> n) { int* code = new int[n]; for (int i = 0; i <= n - 1;原创 2016-10-20 18:48:08 · 453 阅读 · 0 评论