数据结构和算法
tanghaiyu777
kiorffen.com
展开
-
LeetCode:Two Sum
这是第一题的python代码,思路是将输入映射成为一个map,数组元素的值为key,下标为value,然后直接去map中查找target减去每一个元素之后的值,在map中找到key对应的value以及刚才的那个索引就是返回结果。这种解法的时间复杂度只有O(N)。突然发现python因为有很多现成的高级数据结构,写起算法来真方便。 #! /usr/bin/env python """原创 2017-02-16 18:59:40 · 201 阅读 · 0 评论 -
三道题理解动态规划
动态规划是算法导论中介绍的最重要的几种基本算法之一,因为好长时间没有看书,再加上原来就理解的不深入,所以早就忘的差不多了,这两天正好因为一道面试题复习一下。用几句话描述动态规划问题如下:一个问题可以分解若干子问题,每一个子问题为一种状态,求出每一个状态的最优解,进而在它的帮助下求出下一个状态的最优解。解决动态规划问题,最重要的步骤就是找出状态转移方程。有了状态转移方程就可以根据初始状态(边界)求出每原创 2017-02-16 19:09:50 · 313 阅读 · 0 评论 -
LeetCode:String to Integer (atoi)
这一题我总结主要考虑的异常case如下:空字符串都是空白符空白符+正负号结束空白符+异常字符空白符+数字+异常字符还有转换过程中的数据溢出代码如下: #! /usr/bin/env python # -*- coding:gbk -*- class Solution(object): def myAtoi(self, str):原创 2017-02-16 19:08:46 · 207 阅读 · 0 评论 -
LeetCode:Reverse Integer
这一题感觉没什么难度,主要考虑的情况以下两点:翻转之后溢出需要返回0翻转之后为0开头的数据需要把0去掉代码如下: #! /usr/bin/env python # -*- coding: gbk -*- class Solution(object): def reverse(self, x): """ :typ原创 2017-02-16 19:08:10 · 213 阅读 · 0 评论 -
LeetCode:ZigZag Conversion
这一题没有什么难度,主要就是找规律,Zigzag的含义网上有例子讲的很明白。我参考的思路来自这篇文章。 http://blog.csdn.net/cshaxu/article/details/12507201。主要思路很简单:所有行每一个元素index的下一个元素在字符串中的索引为:index + 2(numRows - 1),即重复周期为2(numRows - 1)。除了第一行和最后一行之外原创 2017-02-16 19:07:37 · 267 阅读 · 0 评论 -
LeetCode:Longest Palindromic Substring
第五题是求字符串里的最大回文子串,回文串(Palindromic Substring)就是例如”aba”,“abba”这种,网上有很多使用解决方法,比如使用动归,kmp的变种等解法,时间复杂度从O(n^3)甚至到O(n)。我这里的结题思路是,对字符串里的每一个字符向两边展开,字符串长度增加的条件如下:如果s[end] == s[end+1],end++,长度加1如果s[begin-1] == s原创 2017-02-16 19:06:48 · 267 阅读 · 0 评论 -
LeetCode:Median of Two Sorted Arrays
第四题是找两个已经排序的数组的中位数,其实就是寻找两个排序数组的第k个数。寻找第k个数就需要把k均分到两个数组,可以用到结论如果a[k/2-1]小雨b[k/2-1],那么a[0]-a[k/2-1]必定存在于第k小的有序数列中。解题思路如下,还是非常经典的。保持前一个数组A最短, 后一个数组B较长平分k, 一半在数组A,一半在数组B,如果A的长度不够长,那么pa = min(k/2, len(A)原创 2017-02-16 19:05:58 · 189 阅读 · 0 评论 -
LeetCode:Longest Substring Without Repeating Characters
第三题寻找最大的不包含重复字符的字符串。借助了python的str查找函数,应该不是最优的解法。 #! /usr/bin/env python # -*- coding:utf8 -*- class Solution(object): def lengthOfLongestSubstring(self, s): """原创 2017-02-16 19:01:50 · 186 阅读 · 0 评论 -
LeetCode:Add Two Numbers
leetcode的第二题,把两个整数表示成两个链表,链表表示顺序和整数的顺序反过来,其实可以转换成两个整数相加,但是万一是大数呢。我的思路就是使用的是python的链表表示两个整数,然后把低位相加,再和剩余的高位拼接起来,中间只要注意一下进位的问题,应该不算难。可是偏偏leetcode已经预先定义好了链表的节点结构,不能直接使用python自己的链表计算。我因为是第一次做leetcode的题目,所以原创 2017-02-16 19:01:12 · 233 阅读 · 0 评论 -
寻找一个数组中的最大和最小数
工作一段快两年了,感觉之前学的数据结构和算法基本忘得差不多了,最近一段时间准备复习一下相关知识。有一个求数组中最大和最小数的题目,基本的思路是遍历一遍数组,然后每个一个元素都和最大值和最小值比较,时间复杂度是2(N-1)或2N。比较简单的一种减少复杂度的方法是把数组的元素两两分组比较,然后较大的数和max比较,较小的数和min比较,这种实现方法的时间复杂度是1.5N。还有一种是采用分治法,比较次数也原创 2017-02-16 18:57:56 · 3957 阅读 · 2 评论