2015/10/06写下的归并排序、快速排序、二分查找 #include<iostream>using namespace std;void merge(int a[], int start, int middle, int end){ int index1 = start; int index2 = middle + 1; int * buffer = new int[end - start + 1]; int co
sizeof和strlen sizeofsizeof是一个操作符关键字,返回的结果为 size_t (typedef unsigned int size_t;)sizeof的参数可以是数据类型,也可以是变量,无论是变量还是数据类型,都会转化为数据类型作为参数,因为在C语言中变量是有类型的。发生在编译时候就计算出了sizeof结果sizeof计算的是数据类型占内存的大小数组做sizeof参数不退化。char a[5]sizeo
C++中右移和左移 关于移位操作:“<<” 左移位操作:从右边开始用0补空位 “>>”右移位操作:对于无符号数从左边开始补0;对于有符号数,或者补符号位,或者补0,由编译器决定(gcc的编译器是补符号位)注意:移位的数目是负数或者移位出界时(最多只能移位类型二进制位大小-1),这个操作符的行为是未定义的,位操作只针对整数类型(int long等)或者char类型的数据
LeetCode(268) Missing Number 数学方法class Solution {public: int missingNumber(vector<int>& nums) { //math solution by sum total int sum = nums.size() * (nums.size() + 1) / 2; for(int i = 0; i < nums.size(
LeetCode(264) Ugly Number II 不知道为什么注释掉的三条if语句不和下面的两条语句等价。一个导致结果是正确的,一个导致是错误的,想不通。class Solution {public: int nthUglyNumber(int n) { int id2 = 0; int id3 = 0; int id5 = 0; int rst = 1; int counter = 2; v
LeetCode(263) Ugly Number c++代码如下class Solution {public: bool isUgly(int num) { if(num <= 0) return false; while(num % 2 == 0) num = num / 2; while(num % 3 == 0) num = num / 3; while(num % 5 ==
LeetCode(260) Single Number III 参考https://leetcode.com/discuss/52757/16ms-c-solution 大概的思路: 1、make a filter 2、取出相应位不为0的数 3、再算出另一个数class Solution {public: vector<int> singleNumber(vector<int>& nums) { //make a filter
C++中map、hash_map、unordered_map、unordered_set通俗辨析 转载http://blog.csdn.net/u013195320/article/details/23046305标题中提到的四种容器,对于概念不清的人来说,经常容易弄混淆。这里我不去把库里面复杂的原码拿出剖析,这个如果有兴趣其实完全可以查C++Reference,网上的原码是最权威和细致的了,而且我觉得有耐心直接认真看原码的人,也不需要我这篇速记博文了,所以我这里还是讲的通俗一些,把它们区分的七
LeetCode(258) Add Digits 根据维基百科的公式即可,其实本题如果按照原始的暴力求解,迭代次数不会超过个位次,最大的数字和的整数为1999999999,加起来瞬间缩小到82,下次会更小,很快就会得到答案,何必呢 https://en.wikipedia.org/wiki/Digital_root代码如下:class Solution {public: int addDigits(int num) { r
LeetCode(257) Binary Tree Paths c++代码如下/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; *
LeetCode(242) Valid Anagram class Solution {public: bool isAnagram(string s, string t) { sort(s.begin(), s.end()); sort(t.begin(), t.end()); if(s.size() != t.size()) return false; for(int i = 0;
LeetCode(241) Different Ways to Add Parentheses 在写递归程序时,我不能追踪整个调用过程,如果我这样做,随着递归过程的不断深入,我会觉得累,没有脑力,也没有精力,最终迷失在调用过程,不知道自己在干什么,处于什么方位。我只能关注衔接, 只能关注各种衔接 两层调用树之间的衔接,可能这就是递归编程的本质 c++代码如下class Solution {public: vector<int> diffWaysToCompute(strin
LeetCode(240) Search a 2D Matrix II 如何寻找到一条合适的搜索路径是是解决本题的核心部分,二分搜索在这里是不适用的。我一直试图利用每一行非递减序,每一列非递减序这两条特性来寻找复杂度较小的搜索路径,最后的结果是我并没能充分利用这两条性质。后来在discuss里发现了充分利用两条性质的解决方案,我将其改成迭代版本,更加清晰明了。 discuss链接:https://leetcode.com/discuss/53535/so-clear-
LeetCode(238) Product of Array Except Self 一开始最直接的思路当然是:对于0号位置元素,将剩下的元素依次累乘,然后保存;对于1号位置,重复上述动作。可是题目的意思是我们只能在o(n)时间内完成,上述算法的时间的复杂度是o(n^2),下面在已有方案上优化,优化的方法是找出冗余计算,我们发现:以0号位置和1号位置为例,如果我们已经知道0号位置对应的乘积为p,那么1号位置对应的乘积为p/nums[1]*nums[0],即0号位置和1号位置对应的乘积
LeetCode(237) Delete Node in a Linked List 由于单向链表的不可逆向性,所以一定不可能改变2号位置的指针域,即3号位置的内存一定要用;另一方面,根据函数结果,4这个值一定出现在3号位置。所以一定有的操作是将4这个值放入3号位置,由此整个解决方案浮出水面。突然间发现我开始思考着推理着逻辑着编程了,哈哈 c++代码如下/** * Definition for singly-linked list. * struct ListNode { *
LeetCode(236) Lowest Common Ancestor of a Binary Tree 与LeetCode235的思路一样 先分别搜索出两个节点的父节点序列,然后再找出最低的节点。不过这里搜索父亲节点序列就没有那么简单了,需要用到深度优先搜索。在实现深度优先搜索时感觉又不会了,╮(╯▽╰)╭,花了好长时间c++代码如下/** * Definition for a binary tree node. * struct TreeNode { * int val; *
LeetCode(235) Lowest Common Ancestor of a Binary Search Tree 先分别搜索出两个节点的父节点序列,然后再找出最低的节点c++代码如下/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NUL
LeetCode(234) Palindrome Linked List 1、用快慢指针找到链表中心位置 如果链表长度为偶数个,比如1,2,3,4,最后找到3 如果链表长度为奇数个,比如1,2,3,4,5,最好找到3 2、将后半段反转 3、从一头一尾状态开始判断是否为回文 c++代码如下/** * Definition for singly-linked list. * struct ListNode { * int val; *
LeetCode(233) Number of Digit One 总的思想是先分类(个位,十位,百位),再对各种情况进行统计(前缀有多少种,后缀有多少种,并利用相乘原理)。 以3141592为例,数字1出现在个位,十位,百位,千位,万等等。 下面开始对各种情况进行统计: 1、出现在个位的1的数量为 000000 1 . . . 314158 1 把最后的前缀314159单独考虑 2、出现在百位的1的数量为