- 博客(30)
- 收藏
- 关注
原创 62. Unique Paths
题目大意:m*n的阵列,求从(1,1)到(m,n)路径的总数。大致思路:1.排列组合:(m-1)个行和(n-1)个列的排列组合,需要注意的是,要用double保存结果,int保存结果容易上限溢出。2.递归:uniquePaths(m,n)=uniquePaths(m-1,n)+uniquePaths(m,n-1),测试结果TLE;改进uniquePaths(m,n)=uniqueP
2016-11-03 14:50:14
237
原创 406. Queue Reconstruction by Height
题目大意:有一队人,每个人由一个(h,k)表示,h表示高度,k表示前面高于或等于自己的人个人。给一个打乱了的队列,求出正确的序列。思路:1.每次从队列中找出k=0,再在其中选出h最小的,加入到res队列中;然后对剩余队列做相应的处理;再循环,即可求出全部队列,类似于递归。176ms2.先把队列按h从大到小,h相同则k从小到大的顺序排列,然后依次将每个人插入到res队列。83msCO
2016-10-31 10:29:04
278
原创 242. Valid Anagram
题目大意:给定两个字符串,判断是否由相同的元素构成,除了顺序不同以外。大概思路:先排序,再比较。主要记录下使用系统自带qsort的方法。code:int cmp(const void *a, const void *b){ return(*(char *)a-*(char *)b);}bool isAnagram(char* s, char* t) {
2016-10-17 15:16:02
187
原创 198. House Robber
题目大意:给定一个整数数组(非负),取其中一些数,和值最大。要求不能取相邻的数。思路:1.递归;结果超时2.动态规划。对比两者,递归列举的情况太多,效率太低,后续队列的情况太多。用动态规划,求出到每一个数为止最大的和值,找到递进的公式,用前面已知的和值加上当前的单值。一种是利用前面的已知,一种是依赖后续的未知,因此效率差别太大。动态规划最重要的是递进关系。CODE:
2016-10-11 15:31:15
244
原创 258. Add Digits
题目大意:给一个非负整数,需要将其每个位置上的数字相加,若结果仍然大于10,继续相加,直到结果为个位数为知。要求时间复杂度o(1).思路:自己想了一会,没有想出来,感觉很有意思,就记录下来。把1~20的结果写出来,发现每9个一个循环。代码就一行就搞定了return (num-1)%9+1;
2016-10-09 14:34:58
265
原创 396. Rotate Function
题目大意:给定数组A,长度为ASize,分别用【0~ASize-1】作为各项的系数,求最大值。例子比较明了A = [4, 3, 2, 6]F(0) = (0 * 4) + (1 * 3) + (2 * 2) + (3 * 6) = 0 + 3 + 4 + 18 = 25F(1) = (0 * 6) + (1 * 4) + (2 * 3) + (3 * 2) = 0 + 4 + 6 +
2016-10-08 16:08:51
155
原创 142. Linked List Cycle II
题目大意:给定一个单链表,找出其环路的起始点。若不存在环路,则返回NULL。大概思路:数学题头结点是A,题目要求的环路起点为B,在141题快慢指针算法中求出的相遇点为C。设A到B的距离为a,B到C的距离为b,环路一圈的距离为c。则(a+b)*2=a+b+k*c;(其中k为常数)则a+b=k*c;两个指针分别以相同速度从A、B出发,第一个指针到达B点,路程为a,第二个指针此时
2016-09-27 15:47:50
382
原创 141. Linked List Cycle
-----------------------------------------------------------------------------待续----------------------------------------------------------------------------------------------------题目大意:给定一个单链表,判断是否存在
2016-09-27 11:12:07
186
原创 125. Valid Palindrome (暴力)
题目大意:给定一个数组,只考虑字母和数字,且不考虑大小写区别,判断是不是回文串。思路:暴力。code:bool isPalindrome(char* s) { int len=strlen(s); if(len<=1) return 1; int i=0; int j=len-1; while(i<j){
2016-09-26 15:47:25
175
原创 136. Single Number
题目大意:一个整数数组,每个元素都出现了2次,只有一个元素出现了一次;find it.基本思路:一道easy题,且通过率超过50%,但是没有想出来....尴尬...code:int singleNumber(int* nums, int numsSize) { int i=0; int res=0; while(i<numsSize){
2016-09-26 15:44:35
223
原创 122. Best Time to Buy and Sell Stock II
题目大意:类似于上一题,只不过将只能交易一次的限制放宽为可以交易无限多次。整体思路:将代码做了一点小小的修改就可以了。int maxProfit(int* prices, int pricesSize) { int i,start,end; int res=0; if(pricesSize<=1) return 0; for(i=1,start=
2016-09-26 14:55:02
184
原创 121. Best Time to Buy and Sell Stock
题目大意:给定一个一直序列,求出最大差值,注意只能由后面的数减前面的数。例如:[7, 1, 5, 3, 6, 4]6-1,输出答案5;[7, 6, 4, 3, 1]输出0.基本思路:暴力解法,需要o(n2)的时间复杂度。优化解法,时间复杂度o(n):int maxProfit(int* prices, int pricesSize) { int i,
2016-09-26 11:35:08
150
原创 11. Container With Most Water
题目大意:坐标轴上,有n个点,坐标分别是(1,a1)、(2,a2)...(n,an),其中,纵坐标均是非负整数。从中选取两个坐标,使其与x轴形成一个盛水容器,求最大的盛水量,注意,斜面不能盛水。大致思路:刚开始,用的是暴力解法,分别取距离为1/2/3/4/5...n,然后取最大值,时间复杂度为O(n2),在测试集合比较大的情况下会超时。后面,参考网上的方法,大致想法如下.1
2016-07-19 16:38:39
238
原创 263. Ugly Number
题目大意:判断一个数是不是丑数。丑数的定义是,其素数因子中只能包含2,3,5,不能有更大的素数。同时,1是丑数。思路:用2,3,5不断的整除给定的数后,若剩下的数是1,则该数为丑数。反之,则不为丑数。若剩下的不为1,说明剩下的因子是比2,3,5大的素数或者乘积。code:bool isUgly(int num) { if (num == 1) retu
2016-06-17 15:24:38
285
原创 328. Odd Even Linked List
中等难度题目大意:给定单链表,更换排列顺序,将原来位置1234567,更换为1357246.要求空间复杂度为o(1),时间复杂度为o(n).思路:暴力...code:struct ListNode* oddEvenList(struct ListNode* head) { struct ListNode *p1, *odd, *even; if(!head|
2016-06-06 14:35:40
267
原创 319. Bulb Switcher
这居然又是一道中等难度的题....题目大意:n个灯泡,刚开始的时候全部关闭,每第i轮,将能被i整除的灯泡改变状态,即,第1轮,打开所有灯泡;第2轮,关闭灯泡2,4,6,8...第3轮,打开灯泡3,6,9......第n轮,改变灯泡n 的状态,最后返回亮着的灯泡数目。思路:每个数i,能分解为各个因子,在每个因子那一轮,都被改变状态,只有平方数,最后亮着,例如,12
2016-06-06 09:51:58
162
原创 268. Missing Number
这居然是一道中等难度的题。。。题目大意:给定一个数组,长度为n,其中数字为0~n中的n个,返回缺少的那一个,要求时间复杂度为线性,空间复杂度为常数。思路:求出数组的和,然后,用n*(n+1)/2减去总和就行了...code:int missingNumber(int* nums, int numsSize) { long total=0; int i;
2016-06-06 09:32:01
197
原创 283. Move Zeroes
题目大意:给定一个整数数组,将数组中所有的0移到数组尾部,保持其他非0数的顺序不变,要求是空间复杂度为o(1).思路:循环数组一遍,依次找到第一个为0的位置和第一个非0的位置,进行处理。code:void moveZeroes(int* nums, int numsSize) { int i,j,temp; if(numsSize<1) return;
2016-06-06 08:52:19
204
原创 342. Power of Four
题目大意:判断一个整数num是不是4的指数,不用循环和递归的情况下。思路:(借鉴)4指数的整数的二进制表示只有1个1.其他全为0,于是num&(num-1)=04^n可以分解为3*(4^0+4^1+4^2...+4^(n-1)),于是(num-1)%3=0,貌似这一步可以更优化,采用位运算代替取模。code:bool isPowerOfFour(int num) {
2016-06-03 15:01:24
295
原创 345. Reverse Vowels of a String
题目大意:给定一个字符串,反转其中的元音字母。思路:头尾反转即可code:char* reverseVowels(char* s) { int len = strlen(s); int i=0; int j=len-1; char temp; while(i<j){ while((s[i]!='a')&&(s[i]
2016-06-03 09:48:42
208
原创 338. Counting Bits
难度:Medium题目大意:给定一个非负整数num,对于每一个整数0例如,给定num=5,输出[0,1,1,2,1,2]。思路:我自己先写了0~20的结果,发现了如下规律:1.按1,2~3,4~7,8~15......分组,即2的i次方~2的(i+1)次方减1;2.每组的前半部分与前一组相同,后半部分为前半部分的结果+1;具体可以看代码。code:{CSDN:C
2016-05-18 15:12:22
325
原创 343. Integer Break
难度:Medium题目大意:给出一个整数n(n>=2),可以分解为多个正整数相加(至少2个),求各种组合中,乘积的最大值。思路:若a为其中一个分解因子,1若a>=5,则a可以分解为3*(a-3)=3*a-9>a;若a=4,可以分解为2*2=4;即n尽可能的分解为3和2。又因为3*3>2*2*2,所以,可以先分解出尽可能多的3。再根据n模3的结果来做判断即可。具体可以
2016-05-18 10:55:31
303
原创 344. Reverse String
题目大意:反转字符串。思路:又水了一题,嘿嘿code:char* reverseString(char* s) { int len = strlen(s); int i = 0; char temp; for(i=0;i<(len-1-i);i++) temp=s[i], s[i]=s[len-1-i],s[len-1-i]
2016-05-18 10:19:52
337
原创 58.Length of Last Word
又水了一题,嘿嘿~题目大意:给定一个字符串,输出最后一个单词的长度。字符串只有大小写和空格。思路:直接从后往前找就可以啦。体会:找到这么简单一题,真是不简单啊code:int lengthOfLastWord(char* s) { int len=0, i; int count=0, flag=0; for(i=0;s[i];i++) len+
2016-05-18 09:33:16
267
原创 22. Generate Parentheses
难度:Medium题目大意:n对括号,输出所有的正确的组合,例:n=3,返回值为"((()))", "(()())", "(())()", "()(())", "()()()"。思路:递归。记录已有序列中的‘(’和“)”的数量,保证左括号数大于等于右括号数。递归输出所有结果。代码:void generate(char **res, char *c, int n, int l
2016-05-13 15:41:48
237
原创 7. Reverse Integer
题目大意:反转一个int型的整数。需要注意的地方:1.负号符号位置保持不变;2.翻转后溢出的问题。思路:先把符号位独立出来;用long型保留转换后的结果,再添加符号位,再与INT_MAX和INT_MIN比较,溢出返回0;结果:4ms,击败61.68%。代码:#include int reverse(int x) { long y=0; int pos
2016-05-09 15:01:11
331
原创 9. Palindrome Number
题目:判断一个整数是不是回文,要求,空间复杂度为o(1).思路:1.若为负数,返回false;2.若为0,或者长度为1(可优化为3.根据长度length,依次比较头尾是否相等。总结&&吐槽:C太小众了,多是用C++或者Java。我的算法不够优化,仅击败了28%.....算法思想有待改进(有种思路是:先逆转,再判断是否相等)。代码:
2016-05-08 23:57:39
269
原创 6. ZigZag Conversion
题目大意:给定一串字符串,和一个行数numRows,将字符串按如下方式排列,比如,“1234567890123456”和41 7 32 6 8 2 43 5 9 1 54 0 6再输出每一行组成的字符串,即“1732682436915406”。思路:暴力求解,思想很简单,过程很麻烦。将第一行和最后一行单独考虑,每行间隔为2*(n-1);中间的(num
2016-05-08 00:30:42
341
2
原创 219. Contains Duplicate II
题目大意:有一个整数数组nums[numsSize],若其中存在两个数相等且数组下标的差值不大于k,则返回Ture;否则,返回False.思路:直接暴力求解,两次循环,本以为会超时的,竟然.......AC了,我也就没有再优化了。代码如下:
2016-05-06 10:02:16
335
原创 217. Contains Duplicate
思路一:先二叉排序,然后,循环一遍比较相邻的数,相等返回True,没有重复的则返回False。时间复杂度为O(nlogn).结果:测试用例(1、2、3、4....29999)超时。思路二:以空间换时间,采用时间复杂度为O(n)的桶排序,替换二叉排序。结果:因为桶排序只考虑了数组为正整数的情况,测试用例[1,5,-2,-4,0]出错。思路三:改写桶排序,将范围从正整数调整为-3000
2016-05-04 14:34:54
354
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人