自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

没有对象也没有new方法的大白

if(you are watching){printf(

  • 博客(81)
  • 收藏
  • 关注

翻译 KMP算法

KMP是对字符串匹配优化的算法,要了解kmp算法由来应先了解传统的字符串匹配的工作机制传统的字符串匹配机制如下有两个字符串,上面那个是主串(T),下面那个是模式串(相当于关键字,下面称为p) 要在T中查找是否含有p,我们要做的工作自然是在T和p之间各自定义一个哨兵i和j,各自一位一位比对,如下图 如果i和j所指的值都相同,那么两者都往前走,若是不同,如下图 此时AE不等,...

2018-06-06 16:41:08 142

原创 最短路径的经典算法-Dijkstra算法

最短路径:指两顶点之间经过的边上的权值之和最小的路径,并称路径的第一个顶点为源点,最后一个顶点为终点求最短路径的算法通常都依赖一种性质:两点之间的最短路径也包含了路径上 其他顶点之间的最短路径带权有向图G的最短问题分两类: 单源最短路径:即某一顶点到其他各顶点的最短路径,可用Dijkstra算法求任意一对顶点最短路径:可通过Floyd-Warshall算法求解Dijkstra算法(...

2018-04-07 22:30:45 403

原创 最小生成树的两种经典算法--prim算法和kruskal算法

一个连通图的生成树是图的一个极小连通子图,它包含所有顶点,但只有足以构成树的n-1条边这意味着对生成树来说,砍去它的任何一条边,就会使生成树变成非连通图,若给他增加一条边就会形成一条回路最小生成树:权值最小的那颗生成树叫~最小生成树的性质:最小生成树并不唯一,准确的来说是最小生成树的树形并不唯一最小生成树的权值之和唯一,并且是最小的最小生成树的边数=顶点数-1求最小生成树有两种经...

2018-04-07 21:35:55 3837

原创 109. Convert Sorted List to Binary Search Tree

原题题目描述: 把一个升序链表构建成左右子树深度相差不过1的平衡树思路:构建树一般而言用递归生成 先定义两个快慢指针,一路往前走,当快指针到达尾结点或者尾结点的前驱结点时循环结束.创建树节点,结点数据域为此时慢指针指向的结点的元素值,并由此递归其构建左子树,而其左子树的数据域均取自头结点到慢指针这段(原链表的前半段)其右子树的数据域均取自慢结点后继结点到空结点这段(原链表的后半段)...

2018-08-21 19:47:42 206

原创 24. Swap Nodes in Pairs

原题题目描述: 给定链表,交换每两个相邻节点并返回其头部。思路: 自己构造一个头结点,定义一个cur指针,指向头结点.定义两个指针first和second遍历链表,first指向cur.next,second指向cur.next.nextfirst.next指向second用cur指针串联起链表,即cur.next指向second,second.next指向firstcur指向f...

2018-08-21 11:29:51 749

原创 328. Odd Even Linked List

原题题目描述:把一个链表奇数节点先放一起,然后再把偶数节点穿起来思路:定义两个指针,各自走两步,改变相应的指针域即可,特别注意循环条件/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int...

2018-08-19 15:25:54 158

原创 445. Add Two Numbers II

原题题目描述: 给你两个链表,把他们的元素值各自当成一个整数,然后相加得到的值返回一个链表(注:每个节点位置只放一个数字)思路: 把两个链表压入栈中若栈不为空,从两个栈中取值,和节点值的三者和,与10的商作为结果链表的值,与10取余,得到的值作为下一个值的进位/** * Definition for singly-linked list. * public class L...

2018-08-19 09:20:30 161

原创 725. Split Linked List in Parts

原题题目描述:给你一个链表,安给定的要求分成几段,每段之间长度不相差1,且前面的链表的长度大于等于后面的链表长思路: 先遍历求出链表长再用长度和份数求商得到每段的基本长,求余得到剩下的长度,剩下的长度则遍历时自减分配给前面的链表,当分配完后,后面的链表长度就为基本长用一个指针从头遍历整个链表不停歇,另一个指针根据算出的链表长,在链表中走相对应的长度的步数,走完一个置next域为空....

2018-08-18 20:13:51 127

原创 817. Linked List Components

原题题目描述:给出 head了包含唯一整数值的链表的头节点 .我们还给出了列表G,链表中的值的子集。返回连接组件的数量,G如果它们在链表中连续出现,则连接两个值。思路 我们可以先建立一个哈希表,存放G数组,然后遍历链表,当当前结点在表中出现,且它的下一个结点值不在表中出现或下一个结点为空时,让计数器自增,其他情况就让遍历指针往后走哈希表的具体实现可以用Set集合,也可以用一个bool...

2018-08-18 15:26:32 159

原创 707. Design Linked List

原题题目描述: 设计链表思路:可以自己创建链表,也可以用arryList模拟用arrayList模拟class MyLinkedList { List<Integer> list; /** Initialize your data structure here. */ public MyLinkedList() { list ...

2018-08-18 14:09:15 284

原创 160. Intersection of Two Linked Lists

原题题目描述:判断两个链表是否有公共结点,有则返回相交结点,否则返回null思路:我们可以设两个指针,各自指向a,b链表,两者不相等时循环,当a,b指向null时,则让它们指向另一条链表的头结点,这样当链表相交时,两指针总会在第二次遍历时在相交结点相遇,若不想交,则会在第二次遍历时同时指向null/** * Definition for singly-linked list....

2018-08-17 20:20:04 108

原创 234. Palindrome Linked List

原题题目描述:判断一个单链表是否为回文链表思路:先用用快慢指针,找到链表的中间位置,若链表有奇数个元素则找到中间位置的后一位,然后反转后一部分链表,反转完毕后前后两部分进行遍历比较,若数据域全相同,则是回文链表,反之则反 bool isPalindrome(struct ListNode* head) { struct ListNode* fast=head; ...

2018-08-17 15:45:55 94

原创 203. Remove Linked List Elements

原题题目描述:删除链表中所有数据域等于给定值的结点思路: 可以用递归,若当前结点元素等于给定值则返回下一个结点,否则返回当前结点还可以自己构造头结点,进行迭代删除递归法/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *ne...

2018-08-17 13:32:31 134

原创 141. Linked List Cycle

原题题目描述:判断一个链表是否有循环思路: 定义快慢指针,慢指针走一步,快指针走两步,若两者能相遇,则有循环或者用java里的哈希表,把每个节点的引用存入表中,若访问节点在表中存在则有循环,若因为指针指向空而退出,自然安不存在循环/** * Definition for singly-linked list. * struct ListNode { * int va...

2018-08-17 08:56:23 209

原创 83. Remove Duplicates from Sorted List

原题题目描述:有序链表中删除重复元素思路:相邻元素若相等,则让指针域指向下下个结点,不相等才让指针继续遍历链表/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode* ...

2018-08-16 19:56:00 105

原创 21. Merge Two Sorted Lists

原题题目描述: 把两个递增有序链表,融合成一个递增有序链表思路:常规的思路就不说了,这里介绍用递归实现,代码优雅,啧啧/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNo...

2018-08-16 18:35:49 113

原创 206. Reverse Linked List

原题题目描述:反转链表(没有头结点)思路:总共需要三个指针变量,一个指针指向当前结点,一个指向其前驱结点,一个指向后继结点,遍历链表,把当前结点的指针域指向前驱结点,然后三个指针向后走,遍历结束后,返回指向前驱结点的指针即可/** * Definition for singly-linked list. * public class ListNode { * int v...

2018-08-16 17:56:14 269

原创 237. Delete Node in a Linked List

原题题目描述:编写一个函数来删除单链表中的节点(尾部除外),只允许访问该节点。思路:由于只给了要删结点,没法获取其前驱结点,所以我们采用的策略是复制后继结点的数据域值到当前结点,然后删除后继结点即可/** * Definition for singly-linked list. * struct ListNode { * int val; * struct...

2018-08-16 16:52:05 102

原创 66. Plus One

原题题目描述: 给定表示非负整数的非空数字数组,加上整数的1。存储数字使得最高有效数字位于列表的开头,并且数组中的每个元素包含单个数字。您可以假设整数不包含任何前导零,除了数字0本身思路:从后往前遍历数组,只要元素不为9,那该位置元素加1,然后返回该数组即可,但若元素是9,那把该位置的元素置0,还有种极端情况,当原数组所有的元素都是9时,则要新建一个数组,长度比原数组大1,第一个位置为1,...

2018-08-16 12:57:31 399

原创 35. Search Insert Position

原题题目描述:给定排序数组和目标值,如果找到目标,则返回索引。如果没有,请返回索引按顺序插入的索引。您可以假设数组中没有重复项。思路:二分查找class Solution { public int searchInsert(int[] nums, int target) { int n=nums.length; int right=n; ...

2018-08-16 12:15:13 231

原创 747. Largest Number At Least Twice of Others

原题题目描述: 要你判断具有唯一最大值的数组中最大值是否至少为其他元素的2倍大,是则返回其下标,不是返回-1思路:可以一次遍历找出数组中的最大值和次大值,判断最大值是否大于次大值的两倍即可class Solution { public int dominantIndex(int[] nums) { int max1=-1; int max2...

2018-08-16 11:40:51 156

原创 53. Maximum Subarray

原题题目描述:定一个整数数组nums,找到具有最大总和并返回其总和的连续子数组(包含至少一个数字)。思路:这个典型的动态规划题(dp) 定义两个变量,一个变量用来记录下标移到当前位置时的最大和,而这个做法就是当前元素的值加前一个位置的最大和,若这个最大和<0,则当前元素+0(止损),若前一个位置的最大和>0,则当前位置元素值与之相加,结果就为现在位置的最大和另一个变量则时刻...

2018-08-16 11:02:51 101

原创 118. Pascal's Triangle

原题题目描述:构造如下三角形 思路:遍历行和列,每一层新建一个ArrayList,在行列号及列为0的地方向list里面填1,其他位置的值是其上一行同列及上一行往左偏一列的两个值之和,这两个值要从另一个l结果集合中取得,每一行的Arraylist构建完成后,丢进最终的结果集合中,最后返回class Solution { public List<List<Int...

2018-08-16 00:42:40 84

原创 27. Remove Element

原题题目描述:在数组中删除给定的元素,并返回新的数组长度思路:看代码class Solution { public int removeElement(int[] nums, int val) { int begin=0; for(int i=0;i<nums.length;i++){ if(nums[i]!=...

2018-08-15 23:32:57 71

原创 674. Longest Continuous Increasing Subsequence

原题题目描述:返回数组中最大连续递增序列的元素个数思路:定义一个计数器,当数组中后一个元素比前一个元素大,计数器自增长,同时定义一个最大长度变量,和计数器每次取较大的那个,当然若不是递增,则把计数器重置为1class Solution { public int findLengthOfLCIS(int[] nums) { if(nums.length==0...

2018-08-15 23:19:32 117

原创 121. Best Time to Buy and Sell Stock

原题题目描述:给一个股票价格数组,要你得到最大利益(最小价格买进之后,最大价格出售)思路:定义两个变量,一个累加记录相邻价格可赚利益差价,当差价<0时则置0,另一个变量存放当前最大差价class Solution { public int maxProfit(int[] prices) { int maxAll=0; int maxN...

2018-08-15 22:17:32 95

原创 746. Min Cost Climbing Stairs

原题题目描述:在楼梯上,每i步,cost[i]分配了一些非负成本(0索引)。一旦您支付了费用,您可以爬一到两步。您需要找到最低成本才能到达最高层,您可以从索引为0的步骤开始,也可以从索引为1,求上楼顶的最小费用思路: 要到达当前位置,最小费用就是将当前位置费用与前两个位置的最小费用之和,最后楼顶前两个楼梯费用的最小值便是答案class Solution { public ...

2018-08-15 21:20:23 104

原创 628. Maximum Product of Three Numbers

原题题目描述:在一个有正有负的数组中,返回3个数的最大乘积思路:一次遍历找出最大的3个数和最小的两个数class Solution { public int maximumProduct(int[] nums) { int max1,max2,max3,min1,min2; max1=max2=max3=Integer.MIN_VALUE;...

2018-08-15 17:54:25 104

原创 268. Missing Number

原题题目描述:长为n的数组,元素值为0~n,且不重复,求你找出未曾出现的那个数字思路:借助XOR异或操作的特性即a^b^b=a的骚操作是最快的移位实现int missingNumber(int* nums, int numsSize) { int res=numsSize; for(int i=0;i<numsSize;i++){ ...

2018-08-15 16:46:02 152

原创 876. Middle of the Linked List

原题题目描述:返回一个链表的中间位置,若中间位置有两个,则返回更后的那个思路:用快慢指针,慢指针一次移动一步,快指针一次移动两步,当快指针移动到链尾或者为null时,返回慢指针即可注:按题目意思应该要按链表元素个数的奇偶数来分,当是奇数时,直接返回慢指针,当为偶数时,应该返回慢指针的下一个元素,但我这代码不管奇偶都直接返回慢指针,竟然也过了,玄学啊!/** Definition...

2018-08-15 15:17:54 110

原创 830. Positions of Large Groups

原题题目描述:给你一个字符串,输出连续出现3次及以上的字符的首尾下标(注:是连续出现的位置)思路定义首尾指针,初始化都指向0下标尾指针遍历整个字符串,当首尾字符相同时,则尾指针向前走,当走到首尾字符不同时,计算首尾相隔距离当距离>=3,则把这组首尾下标添加到结果集中更新首指针到尾指针的位置重复以上步骤,直到尾指针遍历完整个字符串class Solution {pub...

2018-08-15 08:39:49 131

原创 661. Image Smoother

原题题目描述:给你一个二维数组,每个元素的值要你按照以他为中心的8个值外加自己的值求平均值,并填在元素位置上,其中有些位置没有8个邻居,那么就找出尽可能多的邻居算平局值(包括自身),按照这个方法最终返回新矩阵思路: 先写一个判断数组下标是否越界的函数然后,遍历数组时,每个位置i,j,按照i和j分别上下左右共8个方向偏移,对每次偏移判断是否越界,由此可找出有效邻居的个数,总和,最终得到平...

2018-08-15 02:38:46 177

原创 697. Degree of an Array

原题题目描述:给定非空整数非负整数nums,该数组的度数被定义为其任何一个元素的最大频率。你的任务是找到一个(连续的)子阵列的最小可能长度nums,其具有相同的度数nums。思路定义两个map集合,一个用来记录数组各元素的首次出现的下标,另一个map用来记录每个元素出现的频率时刻更新degree,找到最大的度数,并同步更新最小长度minlen当degree与另一个元素的频率相同时选...

2018-08-15 01:09:52 75

原创 167. Two Sum II - Input array is sorted

原题题目描述:在有序数组中返回数组值相加为目标值的两个下标思路:一左一右的值相加和目标值大小作比较,然后根据结果,缩小左右位置,直到相等class Solution { public int[] twoSum(int[] numbers, int target) { int l=0; int r=numbers.length-1; ...

2018-08-14 23:19:28 87

原创 217. Contains Duplicate

原题题目描述:判断一个数组的元素是否有重复项思路:用个set集合,遍历数组时,set集合中不存在的数则加入,若set中存在则返回falseclass Solution { public boolean containsDuplicate(int[] nums) { final Set<Integer> distinct = new HashS...

2018-08-14 22:47:11 118

原创 122. Best Time to Buy and Sell Stock II

原题题目描述:假设您有一个数组,其中第i 个元素是第i天给定股票的价格。设计算法以找到最大利润。您可以根据需要完成尽可能多的交易(即,多次买入并卖出一股股票)。注意:您不能同时进行多笔交易(即,您必须在再次购买之前卖出股票)。思路:只需要累加相邻两天,明天比今天高出的价格即可(即只要明天比今天的价格高,就相减累加到利润中)int maxProfit(int* prices, in...

2018-08-14 21:41:56 68

原创 717. 1-bit and 2-bit Characters

原题题目描述:有两个特殊字符,第一个字符可以用一位表示0。第二个字符可以用两位(10或11)表示。现在给出一个由几位表示的字符串。返回最后一个字符是否必须是一位字符。给定的字符串将始终以零结尾思路:从左到右遍历,遇到0下标增1,遇到2下标增2,然后判断最后下标若为n-1则返回truebool isOneBitCharacter(int* bits, int bitsSize) {...

2018-08-14 20:50:30 138

原创 169. Majority Element

原题题目描述:找出一个数组中出现超过n/2次的元素(一定有)两种技巧: 一种是把数组排好序,中位数即为所求擂台打架法,具体看代码方法一class Solution { public int majorityElement(int[] nums) { Arrays.sort(nums); return nums[nums.length/2...

2018-08-14 13:08:13 79

原创 448. Find All Numbers Disappeared in an Array

原题题目描述:一个数组存放1~n之间的数值(n为数组长度),求你找出1~n中未出现在数组中的值,不使用额外空间,复杂度为O(n)思路:遍历数组,把数组的值看成下标,使对应位置的值+n,此工作为标记.然后再一次遍历数组,输出数组值<=n的位置的下标,加入到结果集中class Solution { public List<Integer> findDisappe...

2018-08-14 09:23:36 65

原创 283. Move Zeroes

原题 - 题目描述:给定一个数组,把数组中所有的0都放在最后,其他不为0的数保持原有顺序 - 思路:遍历数组,并定义一个从0开始的下标变量,若不为0,则进行覆盖,最后一路填0,直到长度一致void moveZeroes(int* nums, int numsSize) { int index=0; for(int i=0;i<numsSize;i++){ ...

2018-08-14 02:16:12 110

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除