数据结构和算法
文章平均质量分 63
零点-一条路走到底
为你而走
展开
-
【LeetCode430】至多包含 K 个不同字符的最长子串
340. 至多包含 K 个不同字符的最长子串难度困难91收藏分享切换为英文接收动态反馈给定一个字符串s,找出至多包含k个不同字符的最长子串T。示例 1:输入: s = "eceba", k = 2输出: 3解释: 则 T 为 "ece",所以长度为 3。示例 2:输入: s = "aa", k = 1输出: 2解释: 则 T 为 "aa",所以长度为 2。思路:【滑动窗口+ hash】创建一个map,不停把右边元素放进map,控制里面只有k...原创 2020-12-24 20:32:00 · 873 阅读 · 1 评论 -
【leetcode209】长度最小的子数组
209. 长度最小的子数组难度中等512收藏分享切换为英文接收动态反馈给定一个含有n个正整数的数组和一个正整数s ,找出该数组中满足其和≥ s的长度最小的连续子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。示例:输入:s = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组[4,3]是该条件下的长度最小的子数组。进阶:如果你已经完成了O(n) 时间复杂度的解法, 请尝试O(nlogn) 时间复杂度的解法。pac...原创 2020-12-18 14:31:13 · 193 阅读 · 0 评论 -
【经典案例】DFS数组遍历
从原点遍历,相邻1的数目,如果被遍历过,则把该点标记为2package main// 遍历 1 0 0// 1 0 0// 0 0 1// 从[0, 0]点出发,紧邻的1数目,上面例子为2func main() { // 参数2表示,被遍历过,就把1标记为2 print(paintedRepeatedly([][]int{{1,0,0},{1,0,0},{0,0,1}}, 2))}func paintedRepeatedly(paint [][]int,.原创 2020-12-11 17:18:30 · 632 阅读 · 0 评论 -
【LeetCode152】乘机最大子数组
给你一个整数数组 nums,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。示例 1:输入: [2,3,-2,4]输出: 6解释:子数组 [2,3] 有最大乘积 6。示例 2:输入: [-2,0,-1]输出: 0解释:结果不能为 2, 因为 [-2,-1] 不是子数组。先定义一个数组dpMax,用dpMax[i] 表示以第i个元素的结尾的子数组, 乘机最大的值,也就是这个数组必须包含i个元素。那么dpMax[i] ...原创 2020-11-07 11:31:51 · 219 阅读 · 0 评论 -
【leetcode354】. 俄罗斯套娃信封问题
给定一些标记了宽度和高度的信封,宽度和高度以整数对形式(w, h)出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。说明:不允许旋转信封。示例:输入: envelopes = [[5,4],[6,4],[6,7],[2,3]]输出: 3解释: 最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]。...原创 2020-11-07 09:40:16 · 140 阅读 · 0 评论 -
【LeetCode】129. 求根到叶子节点数字之和
129. 求根到叶子节点数字之和给定一个二叉树,它的每个结点都存放一个0-9的数字,每条从根到叶子节点的路径都代表一个数字。例如,从根到叶子节点路径 1->2->3 代表数字 123。计算从根到叶子节点生成的所有数字之和。说明:叶子节点是指没有子节点的节点。示例 1:输入: [1,2,3] 1 / \ 2 3输出: 25解释:从根到叶子节点路径 1->2 代表数字 12.从根到叶子节点路径 1->3 代表数字 13.因此,...原创 2020-10-30 14:51:26 · 114 阅读 · 0 评论 -
【LeetCode673】 最长递增子序列的个数
673. 最长递增子序列的个数给定一个未排序的整数数组,找到最长递增子序列的个数。示例 1:输入: [1,3,5,4,7]输出: 2解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。示例 2:输入: [2,2,2,2,2]输出: 5解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5。注意:给定的数组长度不超过 2000 并且结果一定是32位有符号整数。这题和LeetCode300有类似之处。。。...原创 2020-10-29 10:10:00 · 125 阅读 · 0 评论 -
【LeetCode300】 最长上升子序列
300. 最长上升子序列给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是[2,3,7,101],它的长度是 4。说明:可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。你算法的时间复杂度应该为O(n2) 。状态定义: dp[i]的值代表前i个数字的最长子序列长度状态转移方程:设j >=0 && j<i ,考虑每轮计算新dp[i]...原创 2020-10-28 11:28:36 · 107 阅读 · 0 评论 -
【LC94】填充每个节点的下一个右侧节点指针
package mainfunc main() { r1 := Node{6, nil, nil, nil} r2 := Node{7, nil, nil, nil} l1 := Node{4, nil, nil, nil} l2 := Node{5, nil, nil, nil} right := Node{3, &r1, &r2, nil} left := Node{2, &l1, &l2, nil} root := Node{1, &...原创 2020-10-16 18:00:06 · 113 阅读 · 0 评论 -
【LC94】: 二叉树中序遍历
给定一个二叉树,返回它的中序遍历。package maintype TreeNode struct { Val int Left *TreeNode Right *TreeNode}func main() { left3 := TreeNode{3,nil, nil} right1 := TreeNode{2, &left3 , nil} root := TreeNode{1, nil, &right1} // 递归中序遍历 左根右 res := ino.原创 2020-10-16 17:55:07 · 167 阅读 · 0 评论 -
希尔排序
在写之前,总结一句话,希尔排序就是增量排序。希尔排序,是在插入排序的基础上改进过来的。直接插入排序,当数据量很大,且数据都无序时,进行排序消耗较高,引申出了采用增量排序,不断减小增量,当增量为1时,数组有序。package yoozoo.day1;import java.util.Arrays;public class Test11 { //希尔排序 public static vo...原创 2018-04-16 10:58:22 · 137 阅读 · 0 评论 -
简单选择排序
package yoozoo.day1;public class Test9 { /* * 每次都选择一个最大或最小的值放到相应的位置上去,复杂度为O(n2) * 选择排序属于不稳定排序,其他选择排序,好比快排,堆排序都是不稳定排序 * */ public static void main(String[] args) { // 简单选择排序 int[] arr =...原创 2018-04-14 15:03:26 · 133 阅读 · 0 评论 -
简单插入排序
简单插入排序:插入排序属于稳定排序算法,有简单插入排序,二分插入排序,希尔排序。这里是简单插入排序,每次从后面未排序元素中取出一个元素插入到前面已经有序的序列中去。其时间复杂度为O(n 2).最好情况是,数组已经有序,比较n-1次,复杂度为O(n),最坏情况是,数组逆序,比较n(n-1)/2次,移动了(n+2)(n-2)/2次, 平均情况移动次数为n^2/4,故直接插入排序的时间复杂度为O(n^2...原创 2018-04-14 14:53:29 · 391 阅读 · 0 评论 -
归并排序
归并排序:用分治法思想,想把问题拆解成可以独立处理的问题,然后再合并。二路归并,把一拆为二,拆分到最后都是一个元素,默认一个元素是有序的,然后再两两合并,知道最后长度达到n。它的空间复杂度为O(n),时间复杂度为O(n logn),属于稳定的排序。package yoozoo.day1;public class Test9 { public static void main(String[...原创 2018-04-14 14:31:32 · 143 阅读 · 0 评论 -
对输入一串字符串找出最大的数字
忧桑,中午11点有一场百词斩的笔试,但是11.10十分才知道,匆匆忙忙的回到宿舍打开电脑做题,三题编程题,做出了第三道,本地编译通过,但是到牛客上就是不通过,忧桑。现在贴出第一道题目。要求:输入一串字符串, 包含字母和数字, 输出最大的数字。比如:fasdf323fajs424434fajsdfl1,结果应该为424434.笔试结束了,自己通过暴力的方式写了下:package com.sort;...原创 2018-03-25 14:03:45 · 3901 阅读 · 0 评论 -
二叉树层次遍历
根据层次遍历的顺序,每一层都是从左到右的遍历输出,借助于一个队列。先将根节点入队,当前节点是队头节点,将其出队并访问,如果当前节点的左节点不为空将左节点入队,如果当前节点的右节点不为空将其入队。所以出队顺序也是从左到右依次出队。代码:import java.util.LinkedList;public class LevelOrder{ public void levelIterator...原创 2018-02-24 23:15:37 · 165 阅读 · 0 评论 -
从尾到头打印链表
这是剑指offer上面试题6: 题目:输入一个链表的头节点,从尾到头反过来打印出每个节点的值。解法一:通过先顺序遍历链表,依次如栈,栈是先进后出的数据结构。package com.nowcoder.wenda.arithmetic;import java.util.ArrayList;import java.util.Stack;/** * Created by wuy原创 2017-11-28 19:35:28 · 112 阅读 · 0 评论 -
链表中环的入口节点
剑指offer 面试题23 : 如果一个链表中包含环,如何找出环的入口节点?第一步: 使用快慢指针,判断链表中是否有环。一个快指针,一个慢指针 。慢指针每次走一步,快指针每次走两步。如果最后有相遇,表示有环,返回相遇节点;如果没有环,则一直遍历到底,返回为null。public static ListNode meetingnode(ListNode head){ if(原创 2017-11-28 21:17:20 · 176 阅读 · 0 评论 -
两个数的和
题目:给定一个整数数组和一个整数target,返回2个元素的下标,它们满足相加的和为target。例子: 给 nums = [2,7,11,15] ,target = 9因为nums[0] + nums[1] = 2 +7 =9所以返回 0 ,1package com.nowcoder.wenda.algorithm;import java.util.HashM原创 2017-11-29 20:59:38 · 309 阅读 · 0 评论 -
Tire树
今天写一个项目,遇到敏感词过滤问题。上面提到了先把敏感词存起来,在这里用到了Tire树来存储。 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。三个性质:原创 2017-12-01 21:10:47 · 354 阅读 · 0 评论 -
敏感词过滤算法
这种方法,是从牛客网上看到的。需要实现功能: 如果有字符串为xwabfabcff,敏感词为abc、bf、bc、m,若这个字符串中包含敏感词,则使用***代替敏感词,实现一个算法。查找步骤:算法如下:1.使用三个指针,指针1指向根节点,指针2指向字符串下标起始值,指针3指向字符串当前下标值。指针1为tempnode=rootnode,指针2为begin=0,指针3为p原创 2017-12-01 21:34:42 · 721 阅读 · 0 评论 -
排序之快速排序
快速排序是一种高效的排序算法,它采用分治法的思想,有“分而治之”的特点。有三个过程:一、分解,把大问题拆解到很小的问题。二、每个小问题都能够有方法解决。三、合并,把小问题各个答案合并package com;//快速排序,默认第一个元素为主元public class Problem1 { /** * @param args */ public stati原创 2018-01-21 21:09:46 · 160 阅读 · 0 评论 -
lintcode508 摆动排序
给你一个没有排序的数组,请将原数组就地重新排列满足如下性质:nums[0] = nums[2] 样例给出数组为 nums = [3, 5, 2, 1, 6, 4] 一种输出方案为 [1, 6, 2, 5, 3, 4]解析:如果按照从1排序,也就是奇数要比相邻的偶数小。偶数要比相邻的奇数大。否则就的交换位置。public class Solution原创 2018-01-21 21:36:57 · 283 阅读 · 0 评论 -
剑指offer39: 数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。方法一: 先对数组排序,然后取中位数,那个中位数肯定是超过一半的数字。采用快速排序时间复杂度为O(nlogn)+取中位数O(n)。原创 2018-01-23 22:07:56 · 161 阅读 · 0 评论 -
lintcode -- Strobogrammatic Number 对称数
A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside down).Write a function to determine if a number is strobogrammatic. The number is represented as原创 2018-01-31 20:01:21 · 237 阅读 · 0 评论 -
数组的全排列
1.问题背景学过数学的人都知道,全排列的意思是什么。现在如何用计算机的编程语言实现数组的全排列呢?数组的全排列可用于求解八皇后问题。与此同时,全排列经常会出现在笔试或者面试,如求字符串的全排列。2.全排列的递归实现2.1求解思路全排列表示把集合中元素的所有按照一定的顺序排列起来,使用P(n, n) = n!表示n个元素全排列的个数。P(n, n)原创 2018-01-31 21:20:00 · 8930 阅读 · 0 评论 -
求两个字符串的最长公共子串
要求:求两个字符串的最长公共子串,如“abcdefg”和“adefgwgeweg”的最长公共子串为“defg”(子串必须是连续的)package com.nowcoder.wenda.agrithom;/** * Created by wuyunlong on 18-2-27. */public class MaxSubString { public static String...原创 2018-02-27 22:04:13 · 344 阅读 · 0 评论 -
如何判断一棵二叉树是完全二叉树
若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。思路:首先对满二叉树按照广度优先遍历(从左到右)的顺序进行编号。一颗深度为k二叉树,有n个节点,然后,也对这棵树进行编号,如果所有的编号都和满二叉树对应,那么这棵树是完全二叉树。任意的一个二叉树,都可以补成一个满二叉树。这样中间就会有很多空洞。在广度优先...原创 2018-02-23 22:58:06 · 484 阅读 · 0 评论