数据结构和算法
鲍春海
我们所知的仅是沧海一粟,我们不知的犹如汪洋大海
展开
-
位运算的一些应用(二)
在java里int的范围是 [−~],共个数,占32个字节,其中第一位是符号位 ,1表示负数,0表示整数。符号 名称 作用 例 & 与 同1为1,其他为0 1&2 结果为0 | 或 不同为1,同1为1,同0为0 1|2 结果为3 ! 非 逻辑取反 !true结果为false ~ 取反 原1为0,原0为1 ~1结果为-2 ^ 异或 相同为0,不同为1...原创 2022-05-18 17:27:38 · 309 阅读 · 0 评论 -
LC 5最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。示例 1:输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。示例 2:输入:s = "cbbd" 输出:"bb"示例 3:输入:s = "a" 输出:"a"示例 4:输入:s = "ac" 输出:"a" 提示:1 <= s.length <= 1000s 仅由数字和英文字母(大写和/或小写)组成解题思路:回文子串的解法有多重:暴力解 动态规划 .原创 2021-12-29 19:55:15 · 233 阅读 · 0 评论 -
二分查找的递归和迭代实现(leecode 35)
二分查找是对有序数组的快速查找方式,时间复杂时O(log n).时间复杂度小于遍历O(n)。实现方式可以通过递归,或者遍历方式递归方式:根据左右两边的位置,找到mid,没找到,大于target就查mid左侧,小于target就查mid右侧,最后没有找到,left>rihgt.返回-1; public int binarySearch(int[] nums,int target,int left,int right) { if (left > .原创 2021-12-25 14:49:25 · 525 阅读 · 0 评论 -
递归-----及一些题的递归思路
一、递归的基本常识 递归的思路是将大问题,分解成小问题,直到最后不能再分的情况,求出结果,再将结果汇总成最终问题的解。是一种典型的分治思想。 递归,有2个比较重要的元素。一个是递归式,一个是终止条件。 递归式,也就是问题拆分过程中,如何自己调用自己,或者简介调用自己 终止条件,也就是程序的退出条件。如果没有终止条件,就是死循环,java的话,会造成栈溢出,报stackoverflow的异常。二、常见题目的递归分析1.跳台阶一...原创 2021-12-12 10:37:29 · 516 阅读 · 0 评论 -
NC40 两个链表生成相加链表
描述假设链表中每一个节点的值都在 0 - 9之间,那么链表整体就可以代表一个整数。给定两个这种链表,请生成代表两个整数相加值的结果链表。数据范围:0≤n,m≤1000000,链表任意值0≤val≤9要求:空间复杂度 O(n),时间复杂度 O(n)例如:链表 1为 9->3->7,链表 2为 6->3,最后生成新的结果链表为 1->0->0->0。示例1输入:[9,3,7],[6,3]返回值:{1,0,0,0}说明:如题...原创 2021-12-02 00:11:01 · 251 阅读 · 0 评论 -
NC25 删除有序链表中重复的元素-I
描述删除给出链表中的重复元素(链表中元素从小到大有序),使链表中的所有元素都只出现一次例如:给出的链表为1→2,返回1→2.给出的链表为1→1→2→3→3,返回1→2→3.数据范围:链表长度满足 0≤n≤100,链表中任意节点的值满足 ∣val∣≤100进阶:空间复杂度 O(1),时间复杂度 O(n)示例1输入:{1,1,2}返回值:{1,2}示例2输入:{}返回值:{}解题思路:因为链表有序,在遍历的过程中,发现重复元素,直接删掉重复节点,就能获取正确原创 2021-11-28 22:00:59 · 309 阅读 · 0 评论 -
NC78 反转链表
描述给定一个单链表的头结点pHead,长度为n,反转该链表后,返回新链表的表头。数据范围: n≤1000要求:空间复杂度 O(1),时间复杂度 O(n)。如当输入链表{1,2,3}时,经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。以上转换过程如下图所示:示例1输入:{1,2,3}返回值:{3,2,1}示例2输入:{}返回值:{}说明:空链表则输出空 ----------------------..原创 2021-11-26 22:58:08 · 394 阅读 · 0 评论 -
NC33 合并两个排序的链表
描述输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。数据范围: 0≤n≤1000,−1000≤节点值≤1000要求:空间复杂度O(1),时间复杂度O(n)如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:或输入{-1,2,4},{1,3,4}时,合并后的链表为{-1,1,2,3,4,4},所以对应的输出为{-1,1,2,3,4,4},转换过程..原创 2021-11-25 23:38:55 · 936 阅读 · 0 评论 -
NC61 两数之和
描述给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列。数据范围:2≤len(numbers)≤1500,−10≤numbersi≤109,0≤target≤109要求:空间复杂度O(n)O(n),时间复杂度O(nlogn)O(nlogn)例如:给出的数组为 [20, 70, 110, 150] , 目标值为90返回一个数组 [1,2] ,因为 numbers1+numbers2=20+70...原创 2021-11-25 00:23:10 · 812 阅读 · 0 评论 -
使用2个栈模拟队列
题目:用两个栈来实现一个队列,使用n个元素来完成 n 次在队列尾部插入整数(push)和n次在队列头部删除整数(pop)的功能。 队列中的元素为int类型。保证操作合法,即保证pop操作时队列内已有元素。栈的特性:先进后出队列的特性:先进先出思路:用2个栈模拟队列,只要第一个栈里添加1,2,3,4,添加之后根据栈的特性,再移动到第二个栈里,变为4,3,2,1 逐个弹出,符合队列先进先出看似问题解决,但是经过测试就会发现,如果stack2里已经有元素了,但是这时候stack1又添加原创 2021-11-23 21:09:37 · 281 阅读 · 0 评论 -
单向链表和双向链表的添加操作
单向链表单向链表,每次添加,向链表尾追加元素。第一个节点为head节点,每次添加的时候,找到最后一个节点,将最后一个节点的next指向新添加的元素。先拿到head节点,每次只需要通过next,就能找到下一个节点public class SingleLinkedList<E> { // 头结点 Node head; // 最后一个节点 Node last; public void add(E e) { Node node原创 2021-11-16 23:23:56 · 936 阅读 · 1 评论 -
一个长字符串中含多个连续和不连续的空格,求不含空格的最长字符串长度,要求算法尽可能最优。例如输入:“a1 123# abc“,结果:4;
题目:一个长字符串中含多个连续和不连续的空格,求不含空格的最长字符串长度,要求算法尽可能最优。例如输入:"a1 123# abc",结果:4;package com;import java.util.Random;public class StringAlgorithm { public static void main(String[] args) { for (int i = 0; i < 1; i++) { String s =原创 2021-11-02 22:51:37 · 119 阅读 · 0 评论 -
3个线程交替打印ABC,打印2次
解题思路:设置3个信号量,通过acquire()获取信号量,获取不到阻塞,执行一条线程后,依次将下一个线程的信号量通过release()释放,执行public class Main { public static void main(String[] args) { Semaphore s1 = new Semaphore(1); Semaphore s2 = new Semaphore(0); Semaphore s3 = new S.原创 2021-03-25 15:21:24 · 82 阅读 · 0 评论 -
数据结构和算法 计数排序
原理:计数排序(Counting sort)是一种稳定的线性时间排序算法。该算法于1954年由 Harold H. Seward 提出。计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。图解:代码实现:代码git地址https://github.com/baochunhai/data-structure-algorithms.git/** * 计数排序,非比较排序 * 对样本内容有要...原创 2020-08-06 00:01:02 · 132 阅读 · 0 评论 -
数据结构和算法 堆排序
原理:堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。若以升序排序说明,把数组转换成最大堆(Max-Heap Heap),这是一种满足最大堆性质(Max-Heap Property)的二叉树:对于除了根之外的每个节点i, A[parent(i)] ≥ A[i]。重复从最大堆取出数值最大的结点(把根结点和最后一个结点交换,把交换后的最后一个结点移出堆),并让残余的堆维持原创 2020-08-04 23:52:45 · 159 阅读 · 0 评论 -
数据结构和算法 快速排序
原理:又称分区交换排序(partition-exchange sort),简称快排,一种排序算法,最早由东尼·霍尔提出。在平均状况下,排序n个项目要O(nlog n)(大O符号)次比较。在最坏状况下则需要 O(n^2)次比较,但这种状况并不常见。事实上,快速排序O(nlog n)通常明显比其他算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地达成。快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为较小和较大的2个子序列,然后递归地原创 2020-08-03 22:43:51 · 149 阅读 · 0 评论 -
数据结构和算法 归并排序
原理:是创建在归并操作上的一种有效的排序算法,效率为O(nlog n)(大O符号)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。分割:递归地把当前序列平均分割成两半。 集成:在保持元素顺序的同时将上一步得到的子序列集成到一起(归并)。递归法(Top-down)申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 设定两个指针,最初位置分别为两个已经排序序列的起始位置 比较原创 2020-07-28 23:16:26 · 129 阅读 · 0 评论 -
数据结构和算法 希尔排序
原理:也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序是基于插入排序的以下两点性质而提出改进方法的:插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位核心是设定一个gap,如下图中设定gap为4,第一次将红色底,间隔为4位的数字排序第二次将蓝色底,间隔为4位的数字排序第三次将紫色低,间隔为4位的数字排序第四次将橙色低,间隔为4位的数字排序最后整体原创 2020-07-25 17:46:12 · 80 阅读 · 0 评论 -
数据结构和算法 插入排序
原理:它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到 O(1)}的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。图解:代码实现:public class InsertionSort { public static void main(String[] args) { int[] arr = So.原创 2020-07-25 00:07:37 · 100 阅读 · 0 评论 -
数据结构和算法 冒泡排序
原理:它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较原创 2020-07-24 21:34:11 · 84 阅读 · 0 评论 -
数据结构和算法 选择排序
原理:1.第一次从数组里选择最大或者最小的元素放在第一位。2.剩余的元素中再找到最大或者最小的元素依次放在已排序的元素后面。图解:选择排序的示例动画。红色表示当前最小值,黄色表示已排序序列,蓝色表示当前位置。代码实现:public class SelectSort { public static void main(String[] args) { int[] arr = {2, 4, 3, 5, 1, 7}; selectSort.原创 2020-07-24 00:40:07 · 77 阅读 · 0 评论 -
数据结构和算法的基础概念
数据结构:是计算机中存储、组织数据的方式。常见的数据结构堆栈(Stack)又称为栈或堆叠,是计算机科学中的一种抽象数据类型,只允许在有序的线性数据集合的一端(称为堆栈顶端,英语:top)进行加入数据(英语:push)和移除数据(英语:pop)的运算。因而按照后进先出(LIFO, Last In First Out)的原理运作。队列(Queue)又称为伫列(queue),计算机科学中的一种抽象数据类型,是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链原创 2020-07-23 00:06:14 · 107 阅读 · 0 评论 -
与、或、异或在算法中的小应用
1.与全1为1,其他为0例:2&32:00103:0011结果:0010==》2应用:判断一个数是否是2的n次方==》a&(a-1)==02.或有1为1,其他为0例:2|52:00105:0101结果:0111==》7应用:在Nio的Buffer抽象类中static void checkBounds(int off, int len, int size) { // package-private if ((off |原创 2020-06-06 19:06:04 · 364 阅读 · 0 评论