数据结构与算法
文章平均质量分 57
lcjmsr
这个作者很懒,什么都没留下…
展开
-
算法学习之最长公共子串
最长公共字串,最长公共子序列,最长递增子序列都是典型的动态规划问题,最长公共子串和最长公共子序列的差别是最长公共子序列可以不连续,但是最长公共子串必须连续。先来看最长公共子串,首先会想到暴力法解决,最长公共子串的暴力法会达到指数级,所以我们直接用dp解决,先确定状态,由于最长公共子串必须是连续的,所以我们这个状态很好想出来,dp[i][j]代表字符串str1位置i之前和str2位置j之前公共子串多原创 2016-03-18 16:01:00 · 859 阅读 · 0 评论 -
leetcode 3. Longest Substring Without Repeating Characters---最长不重复子串 C语言版 faster 100%
最长不重复子串,abcabcbb 则最长的不重复子串是3,abc。 bbbbb 最长不重复子串是b,长度为1,pwwkew最长子串是wke或者kew 为3.解法一:暴力解法 遍历每一个字符串,以次字符串为开头求最长的不重复长度,最后取出最大的,复杂度是O(N^3).int lengthOfLongestSubstring(char* s) { int max ...原创 2018-03-05 22:38:42 · 250 阅读 · 0 评论 -
算法学习之哈希表实现
哈希表是一个键值对的数据结构,经常用于数据库索引,map,缓存等地方。可以表示成value = f(key),查找效率很高。哈希表实现最关键的地方是哈希函数的选择,好的哈希函数可以均匀分布,冲突小。现在工业界最常用的哈希函数是murmur,memcached和nginx使用的就是murmur。简单常用的哈希函数构造法有:1.直接定值法,利用key设计一个线性函数 f=a*key+b; 2.数字分析原创 2017-05-23 14:20:18 · 411 阅读 · 0 评论 -
leetcode141. Linked List Cycle
leetcode141题是判断链表是否有环,最常用的方法是用两个指针,一个快一个慢,快的是慢的速度的一倍,这样如果有环的话刚好快的走了两圈,慢的走了一圈相遇。这样需要遍历2N遍就可以完成判断。自己还想了一种方法,这种方法坏处是需要破坏链表,但是需要N遍就可以AC。先写第一种方法的代码class Solution {public: bool hasCycle(ListNode *head)原创 2016-03-11 11:34:07 · 268 阅读 · 0 评论 -
leetcode26. Remove Duplicates from Sorted Array
这道题就是从一个有序的数组中删除重复的元素,然后返回删除后的数组长度。这道题主要使用两个指针,一个指针指向待比较元素,另一个迭代数组,如果一样往后走,如果不一样,则把数字放到待比较元素的后一个位置。class Solution {public: int removeDuplicates(vector& nums) { if(nums.empt原创 2016-05-12 23:34:23 · 253 阅读 · 0 评论 -
算法学习之8皇后问题
8皇后问题是高斯提出来的一个问题,在一个8*8棋盘上,8个棋子不在同一行同一列,和同一个对角线上的摆放方式有几种,我们一般才有回溯加剪枝的方法求解。回溯剪枝法也是很多公司笔试题中简单题经常考的。#include #include #include #include #include using namespace std;int arry[8][8]; //打印数组用的int t原创 2016-03-25 12:19:11 · 720 阅读 · 0 评论 -
算法学习之子集生成问题
在暴力求解算法中,子集生成问题是一个很重要的算法,在一个数组中找到各种子集,然后筛选出符合题目条件的子集,比如n-sum等问题,现在写一个位向量法生成子集的通用模板#include #include #include #include using namespace std;/*visit是一个标记数组,判断是否选择该位置的数*/void create_subset(vector &a原创 2016-03-25 10:36:26 · 750 阅读 · 0 评论 -
寻找大小为n的数组中出现次数超过n/2的那个数
问题描述: 在一个大小为n的数组中,其中有一个数出现的次数超过n/2,求出这个数。这题看似很简单,但是找到最优解不容易,一般情况我们首先想到最笨的方法,每选一个数,遍历一次数组,复杂度O(N^2),或者先排序再找那个数,复杂度一般为O(NlgN),或者用hash,时间复杂度O(N),空间复杂度需要看输入的数据规模,空间复杂度O(N)。所以这些都不是最优解,我们先分析一下这个题目,设该数出现的次数为原创 2016-03-14 15:21:46 · 7813 阅读 · 0 评论 -
leetcode142. Linked List Cycle II
Given a linked list, return the node where the cycle begins. If there is no cycle, return null.Note: Do not modify the linked list.Follow up:Can you solve it without using extra space?原创 2016-03-11 15:59:32 · 298 阅读 · 0 评论 -
算法学习之快速排序
快速排序是一种经常使用的排序算法,标准c里已经包含了这个算法的实现,在头文件中的qsort(),快速排序的思想是,从一个数组中挑出一个数当中枢轴,这个数的左边所有的数都比它大,右边的数都比它小,然后我们再递归的去寻找左半边和右半边,直到只剩一个数停止递归。这样全部数组就排列好了。一次快排算法描述:1.从一个数组中挑出一个数当关键字中枢轴,一般选择第一个数原创 2016-02-26 15:06:21 · 440 阅读 · 0 评论 -
算法学习之寻找最长等差数列
最长等差数列就是在一个数组中,组成等差数列的最长的那一个,首先我们对数组排序,然后我们一般会先想到暴力法从第一个开始循环遍历整个数组,时间复杂度O(N^3),下面给出伪代码 int i,j,k,len = 0 for(i = 0; i < n; i++) for(j = i+1; j < n原创 2016-02-24 12:32:16 · 3418 阅读 · 4 评论 -
算法学习之字符串全排列
第一种方法字符串全排列,思想上和我们高中学的排列一样,比如123,开始的时候第一个位置有三种选择,第一个选完之后第二个位置就只剩下两种选择,第三个位置,就剩一种,所以一共有n!种排列,所以我们可以用递归的思想去做,递归中做交换#include #include #define MAX 50void swap(char *a,char *b){ char tmp = *a;原创 2016-02-21 16:13:39 · 1076 阅读 · 0 评论 -
算法学习之字符串包含
问题描述:如果字符串B中的字母都能在A中出现,则字符串A包含字符串B,本题可用位运算,用两个long long类型的数字参与位运算,两个long long类型正好128位,可以把字符串全部表示完,时间复杂度O(N),空间复杂度O(1);#include #include #define MAX 50int is_contain(const char *str1,const ch原创 2016-02-21 17:31:59 · 314 阅读 · 0 评论 -
红黑树原理及实现
一.二叉搜索树 二叉树是最常用的树形数据结构,二叉树可以分为完全二叉树,满二叉树,平衡二叉树。二叉树应用的最多就是二叉搜索树,二叉搜索树的定义是:设x是二叉搜索树中的一个结点。如果y是x的左子树中的一个结点,那么y.key<=x.key。如果y是x右子树中的一个结点,那么y.key>=x.key。 也就是左子树小于根节点,根节点小于右子树。 普通的二...原创 2018-10-19 23:01:58 · 365 阅读 · 0 评论