
数据结构与算法
数据结构与算法
weiambt
研究生在读,专注于算法、后端、大模型、AI等领域,擅长Java,Python,Golang。记录学习历程,分享学习心得,欢迎大家交流讨论。
展开
-
【力扣每日一题】lc1969. 数组元素的最小非零乘积(思维+构造)
给你一个正整数 p。你有一个下标从 1 开始的数组 nums ,这个数组包含范围 [1, 2p - 1] 内所有整数的二进制形式(两端都 包含)。你可以进行以下操作 任意 次:从 nums 中选择两个元素 x 和 y。选择 x 中的一位与 y 对应位置的位交换。对应位置指的是两个整数 相同位置 的二进制位。比方说,如果 x = 1101 且 y = 0011 ,交换右边数起第 2 位后,我们得到 x = 1111 和 y = 0001。原创 2024-03-20 14:58:23 · 363 阅读 · 0 评论 -
【力扣每日一题】lc1793. 好子数组的最大分数(单调栈)
对于任意的元素nums[i],我们想要知道在其左边和右边第一个比它小的元素,这个可以用单调栈从O(n)优化成O(1)原创 2024-03-20 13:58:27 · 399 阅读 · 0 评论 -
一款好用的leetcode周赛插件:再也不用写代码的时候来回看描述了
对于熟悉leetcode的小伙伴应该会有一个困扰,那就是在leetcode打周赛的时候,题目描述和编辑区不是左右排版的,而是上下排版的,我们代码写着写着就需要移到最上方再看一下题目描述。使用这款插件后我们就是下面这样的,这样我们就可以不用来回上下移动了。今天发现了一个群友分享的一款leetcode插件,分享给大家。就可以啦,然后竞赛页面就会变成上面那样啦。2.进入浏览器扩展程序,找到油猴。1.在浏览器端下载油猴(3.在油猴中放入这个脚本。原创 2023-10-10 21:17:55 · 648 阅读 · 2 评论 -
反转链表
问题描述定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL三种方法1.迭代(双指针在原链表反转) 2.递归(子问题) 3.使用一个数组存储链表再遍历视频讲解方法1:迭代双指针class So...原创 2022-02-25 14:32:00 · 40 阅读 · 0 评论 -
【数学】任意一个正整数n最多只有一个质因数大于根号n,怎么证明?
假设n存在的1个大于根号n的质因子是p,p的次幂是k>=2(不是1)所以假设不成立,所以至多有1个大于。所以联立得n > p1*p2 >所以假设不成立,所以幂次只能是1。任意一个正整数n最多只有一个大于。的质因子,分别为p1,p2。的质因子,并且该大于。又因为 n > p1。下面证明如果存在大于。原创 2023-03-04 16:46:17 · 1435 阅读 · 0 评论 -
启发式A*算法解决最短路径问题
A*算法:在搜索的过程中,使用一个估价函数对当前点进行评估,找到最好的状态进行搜索,知道找到目标。估价函数F(x)=G(x)+H(x),其中G(x)为实际代价,H(x)为启发函数,这就是启发式。并且启发函数要满足:H(x)<=H*(x),H*(x)为真实值,意思是启发函数的要求是必须小于等于真实值,启发函数的选取决定着A*算法的优劣,当启发值与真实值完全相等时,此时会达到最优的情况。A*算法解决最短路问题A*算法是一种启发式算法,在最短路径问题上是对Dijkstra算法的优化,加入启发函数提原创 2021-06-12 20:28:31 · 5177 阅读 · 3 评论 -
【动态规划】最长上升子序列LIS
今天发现LIS问题还有nlogn的解法,简单记录一下问题描述最长上升子序列问题(LIS,Longest Increasing Subsequence)给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。例如:3 1 2 1 8 5 6 的最长上升子序列长度为4先来复习一下n2的解法解法1:动态规划dp[i]=max(dp[k]+1),a[k]<a[i]ans=max(dp[i])dp[i]是以i为结尾的上升子序列的长度。最后的结果,也就是最长的上升子序.原创 2021-06-04 11:17:37 · 350 阅读 · 0 评论 -
【动态规划】凸多边形的最优三角剖分问题
2021年上半年软考软件设计师下午题的算法题,区间dp问题。问题描述:求N个顶点(1~N)的多边形的最优三角剖分问题,最优:剖分后各三角形边权和的总和最小dp[i][j]:表示第i个顶点到第j个顶点的最优三角剖分问题weight[i][j]:表示顶点i到顶点j的边的权值s[i][j]:记录Vi-1到Vj最优三角剖分的中间点K状态方程:dp[i][j]=min{dp[i][k]+dp[k+1][j]+w[i][j]}#include <stdio.h>#define N 6 .原创 2021-06-02 17:14:39 · 922 阅读 · 0 评论 -
连续子数组的最大和问题(五种解法)
昨天软考(2021年5月29日)试卷上出现了的算法题,问:连续子数组最大和的分治解法的时间复杂度,考完正好总结一下这道算法题。求连续子数组的最大和题目描述:输入一个整型数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。比如上面这个数组的子数组的最大和为187,从下标3到下标7的位置。(本文中数组下标从1开始)思路比较常规的思路是暴力(O(n3))、前缀和数组(O(n2))两种,但是时间复杂度比较高,这题也可以用分治的策略做,时间复杂度O(nl.原创 2021-05-30 16:06:02 · 32301 阅读 · 28 评论 -
n!中质因子p的个数
题目:求n的阶乘中质因子p的个数方法1:枚举i从1~n,找到每i的p因子个数,所有项的总个数就是n!的p因子的个数,时间复杂度为O(nlogn)。int divide(int n,int p){ int cnt=0; for(int i=1;i<=n;i++){ int temp=i; while(temp%p==0){ cnt++; temp/=p; } } retu原创 2021-04-17 16:13:57 · 1362 阅读 · 1 评论 -
hdu 1175 连连看(DFS+剪枝)
http://acm.hdu.edu.cn/showproblem.php?pid=1175连连看Problem Description“连连看”相信很多人都玩过。没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子。如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子),而且线的转折次数不超过两次,那么这两个棋子就可以在棋盘上消去。不好意思,由于我以前没有玩过连连看,咨询了同学的意见,连线不能从外面绕过去的,但事实上这是错的。现在已经酿成大祸,就只能将错就错了,原创 2021-04-17 12:07:26 · 370 阅读 · 0 评论 -
hdu1312 Red and Black
http://acm.hdu.edu.cn/showproblem.php?pid=1312#include<iostream>#include<cstring>#include<queue>using namespace std;typedef pair<int,int> PII;int dx[]={1,0,0,-1};int dy[]={0,1,-1,0};char g[30][30];int dist[30][30],n,m,cnt,s原创 2021-04-16 20:47:44 · 135 阅读 · 0 评论 -
页面置换算法FIFO、OPT、LRU
FIFO——先进先出置换算法OPT——最佳置换算法LRU——最近最久未使用算法#include<iostream>#include<cstdio>#include<queue>#define M 3using namespace std;void FIFO();void OPT();void LRU();void printMemory();int search();struct page{ int k;//页面号 int i原创 2020-12-08 12:08:30 · 1554 阅读 · 0 评论 -
递归——瓶盖换酒问题
啤酒两元一瓶,两个空瓶换一瓶,四个盖子换一瓶问:10元可以买几瓶?分析:第一次购买完啤酒后,将拥有的盖子和瓶子转换成钱,递归购买public class BeerProblem { public static int allBeerNum;//记录购买的啤酒总数 public static int lastPingZiNum;//记录瓶子剩余 public static int lastGaiZiNum;//记录盖子剩余 public static void ma.原创 2020-07-13 19:36:07 · 1553 阅读 · 0 评论 -
排序算法——归并排序(mergeSort)
归并排序归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。排序原理尽可能的一组数据拆分成两个元素相等的子组,并对每一个子组继续拆分,直到拆分后的每个子组的元素个数是1为止。将相邻的两个子组进行合并成一个有序的大组;不断的重复步骤2,直到最终只有一个组为止。归并原理
基本思想: 快速排序,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。排序原理:首先设定一个分界值,通过该分界值将数组分成左右两部分;将大于或等于分界值的数据放到到数组右边,小于分界值的数据放到数组的左边。此时左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值;然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以原创 2020-06-19 11:18:42 · 653 阅读 · 2 评论 -
排序算法——直接插入排序(insertSort)
排序原理 1.把所有的元素分为两组,已经排序的和未排序的; 2.找到未排序的组中的第一个元素,向已经排序的组中进行插入; 3.倒叙遍历已经排序的元素,依次和待插入的元素进行比较,直到找到一个元素小于等于待插入元素,那么就把待插入元素放到这个位置,其他的元素向后移动一位;代码实现public static void insertSort(double a[]){ //i为待插入元素的索引 for(int i=1;i<a.length;i++){原创 2020-06-15 23:11:03 · 612 阅读 · 0 评论 -
排序算法——选择排序(selectSort)
排序原理 1.每一次遍历的过程中,都假定第一个索引处的元素是最小值,和其他索引处的值依次进行比较,如果当前索引处的值大于其他某个索引处的值,则假定其他某个索引处的值为最小值,最后可以找到最小值所在的索引 2.交换第一个索引处和最小值所在的索引处的值代码实现 public static void selectSort(double a[]){ //i为某趟要确定的索引 for(int i=0;i<=a.length-2;i++){原创 2020-06-15 21:54:45 · 460 阅读 · 0 评论 -
C语言实现AVL树的判定问题
定义:AVL树是一种平衡二叉搜索树,AVL树有一个特点,所有节点的平衡因子不能大于1,即所有节点的左子树与右子树的深度差只能为-1,0,1。思路:判断AVL树的思路很简单,只要判断是否是二叉搜索树,再判断是否带有平衡条件...原创 2020-06-15 11:56:05 · 1254 阅读 · 0 评论 -
排序算法——冒泡排序法(Bubble Sort)
冒泡排序法算法思想:在排序过程中对相邻元素进行两两比较,越小的元素会慢慢浮到前面(数组低下标处),经过若干趟比较,元素排序完毕。具体步骤:程序有两层for循环构成,外层循环控制趟数,内层循环控制该趟的比较次数,内部嵌套一个用于交换元素的if语句。外层循环:第一趟比较可以浮出最小的元素,第二趟浮出第二小的元素…每趟循环都可以浮出1个元素,以此类推length个元素共需要length-1趟比较。内层循环:第一趟需要进行length-1次比较,第二趟需要进行length-2次比较…每经过一趟,下趟原创 2020-05-16 16:03:37 · 2224 阅读 · 0 评论 -
求最大公约数gcd(辗转相除法)
求两个数的最大公约数可以用辗转相除法来实现,辗转相除法又叫欧几里得算法,辗转相除法的实现基于一个原理:(a,b)=(a,ka+b),其中(a,b)表示a与b的最大公约数,a、b、k都为自然数大概的意思就是两个数的最大公约数,其中一个数加到另一个数上得到的新数,与原数的公约数不变package day4_7;import java.util.Scanner;public class ...原创 2020-04-07 19:12:11 · 1364 阅读 · 0 评论