
算法基础
ojshilu
https://github.com/lucky521
展开
-
单词变换距离 Word Ladder (图的最短路径)
问题:Given two words (start and end), and a dictionary, find the length of shortest transformation sequence from start to end, such that:Only one letter can be changed at a timeEach intermediate原创 2014-02-28 20:15:53 · 2665 阅读 · 0 评论 -
寻找最少次跳数 - 贪心VS动态规划 Jump Game 2
非常好的问题:Given an array of non-negative integers, you are initially positioned at the first index of the array.Each element in the array represents your maximum jump length at that position.Your原创 2014-03-14 12:35:44 · 4565 阅读 · 0 评论 -
二叉树中增加next指针 Populating Next Right Pointers in Each Node
题目源自于leetcode。题目:Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; }Populate each next pointer to point to原创 2013-11-06 20:58:02 · 1336 阅读 · 0 评论 -
根据单链表构造二叉查找树 Convert Sorted List to Binary Search Tree
问题:Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.思路:二叉查找树的构造往往伴随着二分查找的过程。这是一个单链表而不是数组。二分查找不好用。就用递归吧。每次找到链表的最中间结点, 作为树根节点,左右两侧作为左右孩子。代原创 2014-03-07 10:58:10 · 1428 阅读 · 0 评论 -
无损数据压缩 Lossless Compression
最近一部叫做《硅谷》的mei'ju原创 2014-06-10 21:00:46 · 4754 阅读 · 0 评论 -
KMP算法实现strstr()函数
strStr()函数是C语言库中的字符串匹配函数,函数搜索一个字符串在另一个字符串中的第一次出现。原创 2014-05-30 10:24:51 · 3206 阅读 · 0 评论 -
A-star路径搜索
启发式搜索在于当前搜索结点往下选择下一步结点时,可以通过一个启发函数来进行选择,选择代价最少的结点作为下一步搜索结点而跳转其上。 DFS和BFS在展开子结点时均属于盲目型搜索,它不会选择哪个结点在下一次搜索中更优而去跳转到该结点进行下一步的搜索。与DFS,BFS不同的是,选择的启发函数,可以很快得到一个搜索问题的最优解A*搜寻算法 A*搜寻算法,俗称A星算法,作为启原创 2014-06-03 10:42:24 · 1912 阅读 · 0 评论 -
在无序序列中找出最长的连续序列 Longest Consecutive Sequence
问题:Given an unsorted array of integers, find the length of the longest consecutive elements sequence.For example,Given [100, 4, 200, 1, 3, 2],The longest consecutive elements sequence is [1,原创 2014-03-03 22:23:30 · 1753 阅读 · 0 评论 -
寻找循环有序数组的最小值 Find Minimum in Rotated Sorted Array
二分查找是典型的分治思想,主要应用于有序顺组相关的查找问题。典型原创 2014-10-20 10:14:02 · 2578 阅读 · 0 评论 -
链表的二路归并排序 Sort List
对于链表,想找一种时间复杂度为O(nlogn),空间复杂度O(1)的算法。Sort a linked list in O(n log n) time using constant space complexity.首先想到了归并排序,因为链表的归并不需要辅助空间。思路:和数组的二路归并基本一致。所不同的是:1、要遍历一遍才能找到中间位置。2、首尾位置都要记下来,因为链表不是原创 2014-03-12 13:43:57 · 2961 阅读 · 1 评论 -
循环有序数组中的二分查找 Search in a rotated sorted array
二分查找是必须要掌握的技能。二分查找适用于有序的、顺序的存储结构。1、可以用它来查找某一个数2、可以用于查找某一个范围。如《二分查找有序数组中某个数的所在范围 Search for a Range》。3、可以用它来查找两个有序数组的中位数。4、本文中,二分查找又多了一项新的本领。可以用它在循环有序数组中查找某个数。循环有序数组指的是,将一个有序数组循环左/右移动原创 2013-12-22 19:16:46 · 6168 阅读 · 1 评论 -
0-1背包问题的动态规划解法
问题描述: 有n个物品,每个物品有对应的重量和价值。编号重量价值1w[1]v[1]2w[2]v[1]3w[3]v[3]…原创 2013-10-21 10:38:44 · 1603 阅读 · 0 评论 -
二分查找有序数组中某个数的所在范围 Search for a Range
题目源自于leetcode。二分查找题。题目:Given a sorted array of integers, find the starting and ending position of a given target value.Your algorithm's runtime complexity must be in the order of O(log n).If the原创 2013-12-04 20:38:52 · 3444 阅读 · 0 评论 -
求一个序列的逆序数 Inversion Count for an array
在这篇博文《通过交换相邻数来完成排序所需要的最少交换次数》中,提到了逆序数的概念。它的用处还是很广泛的。本文研究一下怎么求逆序数。按照定义来做的直观求解方法的时间复杂度是O(n^2)的,这个复杂度是不理想的。有没有O(nlogn)的方法呢?当然了,一种优化的求法引入了分治思想(Divide and Conquer)。分治思想的两个经典应用,都在解决排序问题上,一个是归并排序算法,一个是快速原创 2014-01-01 20:13:12 · 2547 阅读 · 1 评论 -
桶排序 Bucket sort
桶排序在操作上类似于基数排序。这是一种分治/划分的思想。先定义一个“桶”,把数据集合分成若干个小集合。然后桶内的排序就是用普通的排序方法,选一个最优的。划分的方法是需一个映射函数f(k),将所有数据分别映射到各自的桶中。基数排序的划分就是按照每个权值位的,桶排序也可以这样,但更好的情况是有一个能类似hash的函数,能做到更好的映射。原创 2013-10-21 10:30:22 · 1622 阅读 · 0 评论 -
八皇后问题 EightQueen
题目:在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即要求任意两个皇后不得处在同一行、同一列或者同一对角斜线上。求出总共有多少种摆法。思路: 对于不在同行且不在同列的摆法,8行每行各有一个皇后,那么就是在8列中进行全排列,很明显有8!种情况。在这8!中情况中,再排除对角斜线上在出现冲突的情况。 对于排列组合类型的问题,经常采用递归方式来解决。数据结构:因为每行原创 2013-11-01 20:01:34 · 2273 阅读 · 0 评论 -
链表的插入排序 Insertion Sort List
使用插入排序算法对单链表进行排序。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {publi原创 2014-03-11 18:40:32 · 1267 阅读 · 0 评论 -
堆的实现 Heap
一定要注意堆排序和堆操作的区别和联系。堆的一个特点是原地操作,所以不要申请新的空间来存堆,原地操作即可。堆的最初始操作是堆的建立、堆的调整,进阶操作是堆的新元素插入和堆的元素删除。这里的插入和删除是可以对堆中的任何一个元素进行的。而堆排序实际上是堆操作的一个片面的应用,其插入和操作都是在堆的起始和末尾进行的。原创 2013-10-08 18:12:46 · 2267 阅读 · 0 评论 -
归并排序 全面总结 Merge Sort
1,这里的归并排序指的就是2路归并排序,将一个序列不断分治,直到分成只有1个元素的序列,然后合并。2,算法的关键在Merge。Merge是将2个有序序列合并为一个有序序列。其中分治后的最小情况,即1个元素的序列就认为是有序序列。依次逐步Merge起来。#include #include #include void merge(int a[], int first, int原创 2013-07-16 19:53:50 · 1479 阅读 · 0 评论 -
数组的最大子数组和 Maximum Subarray
题目源自于Leetcode。题目:Find the contiguous subarray within an array (containing at least one number) which has the largest sum.For example, given the array [−2,1,−3,4,−1,2,1,−5,4],the contiguous subar原创 2013-11-08 15:05:52 · 1366 阅读 · 0 评论