数据结构
朝闻道 ||
难念的经
展开
-
两数之和(力扣1)
给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:nums = [3,2,4], tar...原创 2021-09-04 22:09:51 · 183 阅读 · 0 评论 -
有效的字母异位词(力扣242)
题目描述:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若s 和 t中每个字符出现的次数都相同,则称s 和 t互为字母异位词。示例1:输入: s = "anagram", t = "nagaram"输出: true示例 2:输入: s = "rat", t = "car"输出: false提示:1 <= s.length, t.length <= 5 * 104s 和 t仅包含小写字母解法:1、采...原创 2021-09-04 20:14:45 · 221 阅读 · 0 评论 -
滑动窗口最大值(力扣)
题目描述:给你一个整数数组 nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。示例 1:输入:nums = [1,3,-1,-3,5,3,6,7], k = 3输出:[3,3,5,5,6,7]解释:滑动窗口的位置 最大值--------------- -----[1 3 -1] -3 5 3 6 ...原创 2021-09-02 21:38:35 · 305 阅读 · 0 评论 -
循环队列的实现(Java)
循环对列判空的条件:head==tail判断对列满的条件: (tail+1)%n==head注意对列的tail 指针指向队尾,这个位置不存数据,为了区别队列空,和队列满的条件/** * 基于数组实现的循环队列 */public class ArrayQueue { private String item[];//字符串数组实现队列 private int n = 0;//对列元素个数 private int head = 0;//对头元素下标 priva原创 2021-08-28 23:26:41 · 99 阅读 · 0 评论 -
顺序队列的实现(Java)
/** * 基于数组实现的对列 */public class ArrayQueue { private String item[];//字符串数组实现队列 private int n=0;//对列元素个数 private int head=0;//对头元素下标 private int tail=0;//队尾元素下标 //初始化 public ArrayQueue(){} public ArrayQueue(int capacity){ ..原创 2021-08-28 22:15:48 · 291 阅读 · 0 评论 -
剑指offer 24(反转链表)
题目描述:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL思路:定义三个节点指针,curr指向当前节点,next指向curr的下一个节点,pre指向cur的前一个节点。把cur的指向下一个节点的指针依次指向前一个节点,cur 后移。但是(cur 的指针都指向前一个节点了,就没有办法后移了),这时我们定义.原创 2021-08-28 19:59:36 · 62 阅读 · 0 评论 -
盛最多水容器(力扣题)
题目描述:给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点(i,ai) 。在坐标内画 n 条垂直线,垂直线 i的两个端点分别为(i,ai) 和 (i, 0) 。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。我这里写了两种解法:1:双指针法(向中间夹逼)2:暴力求解(两个for 循环求出 最大的容器面积)法一://时间复杂度为O(n)class Solution { public i...原创 2021-08-28 00:12:04 · 83 阅读 · 0 评论 -
数组最大值(力扣题)
给你一个整数 n 。按下述规则生成一个长度为 n + 1 的数组 nums :nums[0] = 0nums[1] = 1当 2 <= 2 * i <= n 时,nums[2 * i] = nums[i]当 2 <= 2 * i + 1 <= n 时,nums[2 * i + 1] = nums[i] + nums[i + 1]返回生成数组 nums 中的 最大 值。这题基本上是按照题目要求:我这里用两种解法:法一:public class arrMax原创 2021-08-28 00:04:42 · 194 阅读 · 0 评论 -
三数和(力扣题)
给你一个包含 n 个整数的数组nums,判断nums中是否存在三个元素 a,b,c ,使得a + b + c = 0 ?即 a+b=-c请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]看了题解才写出的代码:思路;1:暴力求解,即三个 for循环,一次遍历最终得到结果,这里不说明思路 2:双指针法,(这个我没想到,看代码才明白...原创 2021-08-27 23:57:27 · 269 阅读 · 0 评论 -
移动零(力扣题)
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。解法:我这里定义一个下标 j 其中nums[j]用来存放,数组中非零的数首先用一个f o r循环遍历数组,找到所有非零的数,并且把赋值到nums[j] 当中。代码如下:class Solution { public vo...原创 2021-08-27 23:47:46 · 63 阅读 · 0 评论 -
爬楼梯(力扣算法)
题目描述:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数解法:第n个台阶只能从第n-1或者n-2个上来。到第n-1个台阶的走法 + 第n-2个台阶的走法 = 到第n个台阶的走法,已经知道了第1个和第2个台阶的走法,一路加上去。目前我会两种解法:1:递归2:累加第一种解法时间复杂度为O(2^n) 在提交的过程中超时了这是最最基本的斐波那且数列 ,最基本的递归求法:...原创 2021-08-27 23:36:42 · 475 阅读 · 0 评论 -
链表的逆置(带头节点)
首先建立一个带头节点的链表:public class headListList { public static class Node { public int data; public Node next = null; public Node() { } public Node(int data) { this.data = data; } } pri原创 2021-08-27 23:17:47 · 600 阅读 · 0 评论 -
插入排序算法
插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 public static void main(String[] args) { //直接插入排序 int a[]=new int[]{5,8,66,2,45,25,35,9,}; ..原创 2021-08-20 20:44:15 · 116 阅读 · 0 评论 -
选择排序算法
选择排序和冒泡排序有一点点像,选择排序是默认前面都是已经排序好的,然后从后面选择最小的放在前面排序好的的后面,首先第一轮循环的时候默认的排序好的为空,然后从后面选择最小的放到数组的第一个位置,第二轮循环的时候默认第一个元素是已经排序好的,然后从剩下的找出最小的放到数组的第二个位置,第三轮循环的时候默认前两个都是已经排序好的,然后再从剩下的选择一个最小的放到数组的第三个位置,以此类推。下面看一下代码。 public static void choice(int a[]) { fo原创 2021-08-19 22:33:32 · 70 阅读 · 0 评论 -
分块查找
分块查找是折半查找和顺序查找的一种改进方法,分块查找由于只要求索引表是有序的,对块内节点没有排序要求,因此特别适合于节点动态变化的情况。分块查找要求把一个数据分为若干块,每一块里面的元素可以是无序的,但是块与块之间的元素需要是有序的。即第1块中任一元素的关键字都必须小于第2块中任一元素的关键字;而第2块中任一元素又都必须小于第3块中的任一元素 public static void main(String args[]) { int index[] = {22, 48, 8...原创 2021-08-17 22:40:20 · 300 阅读 · 0 评论 -
二分查找
前提是数据有序二分法查找适用于大的数据,但前提条件是数据必须是有序的,他的原理是先和中间的比较,如果等于就直接返回,如果小于就在前半部分继续使用二分法进行查找,如果大于则在后半部分继续使用二分法进行查找……我们来看下代码 public static int binarySearch(int a[],int k) { //二分查找,只使用与顺序表的查找 int low=0; int high=a.length-1;//最后一个元素原创 2021-08-17 11:09:49 · 73 阅读 · 0 评论 -
暴力匹配算法
原理:暴力字符匹配算法的实现原理还是非常简单的,从第一个字符开始进行匹配,如果匹配不成功,移动到下一个字节重新开始逐个匹配代码如下:public class num { @Test public void test() { /** * 暴力匹配算法 */ String s1="aeefafacdabc"; String s2="efa"; int dex=I..原创 2021-08-12 23:49:02 · 322 阅读 · 0 评论 -
顺序表的删除
顺序表删除第 i 位元素//注意Length是从1 开始//而数组下标即data 是从0 开始#include<iostream>using namespace std;#define MaxSize 10 //默认最大长度typedef struct{ int data[MaxSize]; int Length; //当前表长}SeqList;void InitList(SeqList& L){ L.Length = 6; for (int i =.原创 2021-07-29 23:42:23 · 468 阅读 · 0 评论 -
顺序表的插入
要求实现递增顺序表的插入操作。L是一个递增的有序顺序表简单注释都在代码里,一目了然。测试了输出的操作,自己试了多次,符合预期结果#include<iostream>using namespace std;#define MaxSize 10 //默认最大长度typedef struct //线性表的自定义结构体{ int data[MaxSize]; int Length; //当前表长}SeqList;void InitL原创 2021-07-29 23:37:55 · 202 阅读 · 0 评论 -
冒泡排序算法
冒泡排序算法的原理如下: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 步骤如图:代码如下:代码中采用StringBuilder 把数组的字符串进行输出public class maopao { pub.原创 2021-07-28 23:42:08 · 60 阅读 · 0 评论 -
二叉树的遍历(前序遍历,中序遍历,后序遍历)
一、二叉树的遍历方式 1、前序遍历 2、中序遍历 3、后序遍历遍历思想:遍历二叉树采用递归的方式,首先要理解递归的思想。遍历是要先判断根节点是否为空,如果不为空时,再向下遍历。二叉树的遍历: 按某条搜索路径访问树中某个节点,树的每个节点均被访问依次,且只访问一次先序遍历:先访问根,再访问左子树,再访问右子树 (根左右)中序遍历:先访问左子树,在访问根,再访问右子树(左根右)后序遍历:先访问左子树,再访问右子树,再访问根 (左右...原创 2021-07-28 23:25:06 · 2090 阅读 · 0 评论