自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

G弦上的詠嘆調

谁都寄予希望,却不相信永恒。

  • 博客(84)
  • 资源 (1)
  • 收藏
  • 关注

原创 Ubuntu 18.04 ImGUI 配置

环境:ubuntu 18.04 LTS , CLion, OpenGL3, gl3w, glfw, imguiopengl 的安装:sudo apt-get install build-essentialsudo apt-get install libgl1-mesa-devsudo apt-get install libglu1-mesa-devgl3w:(调用opengl的函数的接口)...

2018-05-26 08:39:25 5216

原创 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 408

原创 Wiggle Subsequence

原题地址:点我传送思路是从第一个差开始,如果前面的大,那就找比当前数更大的,然后反转。前面的小同理,注意排查一些特殊情况。C++:class Solution {public: int wiggleMaxLength(vector& nums) { int n = nums.size(); if(n<2) {

2017-06-01 19:02:42 326

原创 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 294

原创 Coin Change

原题地址:点我传送本来想用之前那个构造和的方法做,但是那个方法还保留了构造的过程,会超时。就只能退而用dp做。(其实是一开始没想到好吗)此时用ans[i]数组表示需要的amount为i时的解。显然0时解为0.后面对于每个i,对每个硬币,如果硬币值小于所需值,则可以拿。拿与不拿两种情况取小即可。C++:class Solution {public: int coinChan

2017-06-01 17:42:11 424

原创 配置VsCode的C/C++编译环境

配置VsCode的C/C++编译环境(第一篇Markdown博客)

2017-05-23 15:52:25 5203

原创 计算药量项目中的TabControl控件使用

接一位亲戚工作时的需求,需要做一个简单的药量计算程序,分为粉剂和水剂两种情况计算。计算的公式并不复杂,为了将两种情况合在一个对话框程序中实现,需要用类似属性单的功能,但不知道基于对话窗的MFC程序要怎么使用属性单(基类是CWnd而不是CDialog),看到TabControl控件可以实现了类似的功能,就尝试做了一下。最后效果是这样的:其实严格来说这个控件并不是像属性单那样的(或

2017-05-18 17:05:05 509

原创 Implement Trie (Prefix Tree)

原题地址:点我传送思路是这样的:设计一个这样的结构体,一个节点有26个指向其他节点的指针,同时有一个值记录这个节点是否是按这个字符串查找下来的最后一个值。加入字符串时将每个字符串从头开始,根节点的第(字符-‘a’)个指针指向了一个新的节点,以此类推,最后那个节点设置记录值。搜索时也是如此,从头开始,如果这个指针不为空,则往下按字符查找,查找到最后的那个节点要有记录值才是查找成功。C++

2017-05-16 01:08:01 308

原创 Combination Sum

原题地址:点我传送就是一个要慢慢构造出来的办法,但是感觉自己对算法还是不够熟,构造的过程有很多问题,参考了别人构造的解法。构造是这样完成的:记录一个begin初始为0作为构造起点,从begin的数开始,如果比target小,就把它加进来,然后再从begin开始构造(此时为一个递归),target变成target减去刚刚加进去的数。最后如果target==0(即构造完成)把它加进去ans里。

2017-05-15 23:41:44 355

原创 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 234

原创 01 Matrix

原题地址:点我传送有想法是用广度优先做,但是感觉可能会太耗时间,就想按顺序遍历,给每个1取临近的1的距离值+1中最小的,如果临近有0则距离必为1最小(实际上这样访问的只能是左边和上面的1,因为后面的1的距离值还没有算出来)。但是这样会有一个问题,即后面出现临近的0时右边或者下面的与新出现的0临近的点的距离值还没有算出来,无法给当前算的距离值提供,而此时新出现的0可能会带来更小的距离值。于是就再

2017-05-03 23:12:41 412

原创 Longest Substring Without Repeating Characters

原题地址:点我传送这道题的思路还是比较简单的(但是要用到哈希容器),用一个哈希表记录在字符串中某个字符出现的最后一次的位置,并用两个值记录当前无重复字符字串的头和尾。然后从头遍历到尾的时候如果有已出现的字符,则更新当前记录的字串的首部到该字符上次出现的下一位和当前首部的较大值,另外还要更新哈希表和最长字串长度。Java:public class Solution { pub

2017-04-25 19:39:49 288

原创 Gas Station

原题地址:点我传送对这个圈做遍历,从该点出发,对每到一个点,计算剩余汽油量remain,如果remain小于0则说明不能往下走了,此时remain同时表示从出发点到这里的下一个点的汽油消耗量,要进行另外一次新的出发,出发点应是此时的点往后一个(即下一个点),因为中间肯定是行不通的。remainCost再加上此时的remain就是出发点0到这里的下一个点所消耗的总汽油量了。设定好新出发点(i+1

2017-04-21 02:31:53 383

原创 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 250

原创 Triangle

原题地址:点我传送首先想,最短路径的选择是从顶端发散到底端的,换言之,就是从底端聚集到顶端的。所以对底部的每一个数都有一个最短路径,其中的最短值即为所求。对每一个最短路径有这样的状态转移:即ans[i] = min(ans[i],ans[i+1])+triangle[row][i]ans[i]是对该层第几个值而言由下向上追溯的最短路径值,它是之前(即下层)的左右值分别与它所在的矩阵中的

2017-04-21 01:57:14 394 2

原创 House Robber II

前情提要:House Robber I原题地址:点我传送根据前面的思路,成圈后的问题在于最后一个的取舍与第一个的取舍有关,这样考虑:若抢第一个,则最后一个不能抢,倒数第二个和第一个的取舍独立,这就是第一题的情况,同样,若不抢第一个,则第二个与最后一个的取舍独立,同样是第一题的情况,因此可以解答。Java:public class Solution { static publ

2017-04-21 01:02:54 314

原创 House Robber

原题地址:点我传送动态规划的题目,每次这样的题目一开始都想不到怎么做......用两个变量来记录答案,分别是不抢前面最后一间房(norob)和抢前面最后一间房(rob)的值。对每一个房间,如果要抢,那rob就会更新到norob+该房间的钱(因为不能连续抢),如果不抢,能norob就可以更新到上一个rob(因为过了一个房间)和本身的最大值。最后答案是对最后一个房抢和不抢情况的最大值,即最

2017-04-21 00:32:21 382

原创 Island Perimeter

原题地址:点我传送看上去第一时间想的可能有些复杂,后来想到用两个数组来代表水平和垂直的线,对每一个属于小岛的格子,测试它的四周,如果是水就将与那一个相邻的那条边加入到岛边,否则就不是岛边。其实可以直接计数,但为了更好理解先用数组记录下来,最后再计数。对于类似这种问题,测试四周都是很经典的想法。Java:public class Solution { public int isl

2017-04-17 15:44:26 306

原创 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 375

原创 Friend Circles

原题地址:点我传送本质上是对一个领接矩阵做一个图的广度优先遍历,对每一个点,如果之前已经被遍历过,那么就已经存在于一个朋友圈中,无需再遍历。如果没有,则广度优先遍历并记录。最后的count便是答案。C++:class Solution {public: int findCircleNum(vector>& M) { int count = 0;

2017-04-11 09:46:14 377

原创 Most Frequent Subtree Sum

原题地址:点我传送指向很明确,就是要用map容器,或者是做哈希表,思想都一样,java这方面还不是很熟,先用的C++来做。首先明确肯定是后序遍历计算sum,然后让sum对应的count++,并与记录最大值的maxCount比较。最后再遍历整个map容器,count==maxCount的就可以放进ans向量里。注意传递要使用按引用传递。C++:/** * Definition fo

2017-04-10 23:54:13 346

原创 Add Two Numbers II

原题地址:点我传送比之前的Add Two Numbers I更进一步,这次链表给的是直接按最高位到最低位的顺序,稍微加大了些难度,但是想到类似的结构应该是栈,将两个链表分别存进栈里后再取出来相加,答案再入栈,最后再从答案栈中构建链表,即满足题目要求。Java:/** * Definition for singly-linked list. * public class ListNo

2017-04-10 15:31:15 262

原创 Nim Game

原题地址:点我传送又是一道游戏题,对于所有类似的问题,都是从找必胜法入手。如这个游戏,只要小于等于3必然是可以赢的,4的时候必输。那么567的时候必胜,因为可以把必负局面留给对手,这样下去不难发现,只要是4的倍数,就是必负,否则必胜。Java:public class Solution { public boolean canWinNim(int n) { re

2017-04-10 15:05:53 391

原创 Merge Two Sorted Lists

原题地址:点我传送这其实就是归并算法的归并一步。思想就是两个链表从头开始,每次比较小的往里面塞,到一个链表尽头后将另一个表的后面全部放到所求表的后面即可。比较麻烦的是所求表ans开辟空间是先开辟在放数,所以一定要确定有即将插入的值时才开辟一个新的空间,否则就会多出一个“0”。C++:/** * Definition for singly-linked list. * struc

2017-04-01 13:16:55 292

原创 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 321

原创 Same Tree

原题地址:点我传送要判断两个树是否一样,判断根节点后再判断左子树和右子树情况的与就好了。注意到这个判断是逻辑短路的。Java:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right;

2017-04-01 13:09:42 281

原创 Climbing Stairs

原题地址:点我传送不难想到其实就是斐波那契数列,因为只有1或2步两种走法,其实就是n-1的走法和n-2的走法之和(要么最后一步是1,要么最后一步是2)。实现的话直接递归真的超慢会超时的(自己可以试试输入1~50,后面每个答案出来都会很慢),所以干脆先算出一些存进数组里再递归就好了。更简单就是打表一部分。Java:public class Solution { public

2017-04-01 13:05:39 252

原创 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 231

原创 Remove Nth Node From End of List

原题地址:点我传送挺有意思的一道题,要删除链表中的倒数第n个值。最简单的就是直接一次循环找到末尾,然后再一次循环到倒数第n-1个删除即可。但是这样做难免给人浪费的感觉,其实只用一次循环也可以做成。只需要使用两个指针,一个是先从头指针出发往后n-1个的位置,另一个则是头指针开始。当走在前面的指针到末端时,后面的指针跳过一个位置就把那个位置即倒数第n个值给删除了。但这样做的问题是删除第一个和最

2017-04-01 12:43:32 248

原创 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 229

原创 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 273

原创 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 246

原创 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 347

原创 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 316

原创 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 512

原创 2016/12/15 1003. Multi-key Sorting

参考:http://blog.csdn.net/chenhq1991/article/details/7865285题目本身并不难,就是将一个整数序列输入时先去掉相邻重复的,然后再从后开始记录最后(从后开始的话就是最早的)一个已存在的整数,后面相同的则不再记录,最后输出即可。但是不知道为什么自己打出来的始终是超时......原版:#include #include #include

2016-12-15 17:14:22 516

原创 2016/12/15 1002. Extended Normal Order Sort

参考: http://www.lxway.com/4044821961.htm题目的意思有毒,有很多地方是要自己不断WA去摸索的,题意定义的排序是这样的:1.小写字母按大写字母来处理;2.若一个加减号在一个数字的前面,而不在一个数字的后面,那这个加减号表示正负;3.一般字符按ASCⅡ码来处理。因此对于每个输入的字符串要做的操作是:1.数值为0的子字符串(0、00、+00

2016-12-15 17:11:37 1156

原创 2016/12/8 1004. 寻找第k大数字(numberk)

这个问题有很多博客讨论了,这里是STL拯救世界,直接构造出了优先序列。以后还是认真看看这个问题吧。// Problem#: 19855// Submission#: 4951919// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported Li

2016-12-08 21:14:11 1719

原创 2016/12/8 1003. 简单哈希

原理不难,就是一个链表的建立而已。// Problem#: 19854// Submission#: 4951626// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License// URI: http://creativecom

2016-12-08 21:12:31 433

原创 2016/12/8 1002.Babelfish

用map很简单做出来,注意下输入时getline和cin就没什么问题了。// Problem#: 19853// Submission#: 4951498// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License// URI:

2016-12-08 21:11:30 363

logic in computer science 数理逻辑课本

logic in computer science modelling and reasoning, 数理逻辑课本,作者:huth

2018-06-26

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除