
算法
小南的学习笔记
这个作者很懒,什么都没留下…
展开
-
【算法】暴力法求最大公约数和最小公倍数
两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。公式法求最小公倍数:lcd = a * b / gcd。例如12和16的公约数有1、2、4,最大公约数是4。例如:45和30的最小公倍数是90。原创 2024-08-08 20:27:31 · 498 阅读 · 0 评论 -
【算法】十进制转换为二进制
首先我们手算的情况是通过求余数算出进制数,同样代码也是通过做除法和求余数的方式,目的:将十进制转换为二进制。原创 2024-07-09 11:01:49 · 615 阅读 · 0 评论 -
【算法】KY250日期类
输入第一行表示测试用例的个数m,接下来m行每行有3个用空格隔开的整数,分别表示年月日。测试数据不会有闰年。编写一个日期类,要求按xxxx-xx-xx 的格式输出日期,实现加一天的操作。按xxxx-xx-xx的格式输出,表示输入日期的后一天的日期。原创 2024-03-07 17:23:13 · 444 阅读 · 0 评论 -
【算法】KY111日期差值
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD。每组数据输出一行,即日期差值。原创 2024-03-07 17:07:46 · 444 阅读 · 0 评论 -
【算法】KY258 日期累加
输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数。设计一个程序能计算一个日期加上若干天后是什么日期。输出m行,每行按yyyy-mm-dd的个数输出。原创 2024-03-05 21:05:30 · 462 阅读 · 0 评论 -
【算法】KY19 今年的第几天?
输入可能有多组测试数据,对于每一组测试数据, 输出一个整数,代表Input中的年、月、日对应本年的第几天。包括三个整数年(1<=Y<=3000)、月(1<=M<=12)、日(1<=D<=31)。输入年、月、日,计算该天是本年的第几天。原创 2024-03-05 20:48:13 · 422 阅读 · 0 评论 -
【算法】KY222 打印日期
可能有多组测试数据,对于每组数据, 按 yyyy-mm-dd的格式将输入中对应的日期打印出来。输入包括两个整数y(1原创 2024-03-05 20:46:40 · 776 阅读 · 0 评论 -
【算法】约瑟夫环
约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3。原创 2023-12-06 22:40:04 · 193 阅读 · 0 评论 -
【LeetCode】【Java】买卖股票的最佳时机||
给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。返回 你能获得的 最大 利润 。示例 1:示例 2:示例 3:提示:1原创 2022-11-19 10:19:10 · 281 阅读 · 0 评论 -
【LeetCode】【Java】删除排序数组中的重复项
使用快慢指针,慢指针代表没有重复数字的末尾,快指针寻找不同数字,由于是有序的,所以快指针寻找到的不同数字不会再次出现到有序序列中。原创 2022-11-19 10:18:05 · 216 阅读 · 0 评论 -
【LeetCode】【Java】 最小公倍数为 K 的子数组数目
tp < k 只有当前子数组的第一个元素可能出现该情况,最小公倍数不是k,但是可能和后续元素一起可能构成最小公倍数,需要跳过。一开始我被困扰在求子数组上了,其实利用两个for循环就可以解决,至于最小公倍数的求解,可以通过求最大公约数间接求最小公倍数。当遍历中,在连续的子数组中,有一个数不符合后,就跳出内循环,从起始位置i的下一个元素开始,外层for循环是确定每次遍历的起始位置i,内层for循环是求从i开始的所有子数组,题目给出了两个关键条件,求最小公倍数,求子数组,明确问题,接下来就是求解了。原创 2022-11-14 20:13:10 · 1059 阅读 · 0 评论 -
【LeetCode】【Java】两数相加
明白题意,思路其实很简单,就是利用链表的特性进行求解,我们可以用循环来遍历两个链表,当其中一个链表不为null时,我们就可以求和,把求到的结果存到新的链表中,最后返回链表的头结点即可。题目首先给出了几个关键条件,“非空链表”、“表示两个非负整数”、“逆序存储”、每个结点存储一位“、”两数相加“,其中比较关键的信息是。,为什么要用逆序存储呢?题目最终让求两数相加,我们平时在进行加法运算时,都是从。,这样也符合链表的顺序,便于求解,否则我们还要将两个链表反转再相加。,那么题目说逆序存储,那么我们。原创 2022-11-07 19:46:40 · 282 阅读 · 0 评论 -
【LeetCode】【Java】有效的数组
通过用三个数组res存每个数字出现的次数(1-9),每个数只能最多出现一次,在每行、每列、每个块中,遇到空格(.)需要跳过,我们可以判断其ASCII码即可(.的ascii是46),每个数出现的次数,通过使用数字字符的ASCII码减去48,把49到57映射到1-9,方便计数。的三个必要条件,我们只需要判断数独是否符合这三个条件即可,最容易想到的就。原创 2022-11-04 19:59:08 · 157 阅读 · 0 评论 -
求素数(质数)算法
今天在做pta乙级1007素数猜想时又遇到了这个算法,求的算法有很多,这里就贴上比较容易想到的一种算法,但里面还是有需要注意的地方的。算法思想:素数(质数):质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。简单的说就是一个数只有被自己或者1整除,比如2、3、5… 给出概念了,接下来就是该如何去判断一个数是否是素数了,我们可以用for循环来对从2到这个之间的所有数进行求余数,要是余数为零就说明可以被整除,就不算是素数,而2到这个数之间的所有数都不能被整除的就是素数了,这也是为什原创 2021-12-09 23:00:48 · 1034 阅读 · 0 评论 -
【贪心算法】-背包问题
🚀贪心算法-背包问题贪心算是把一个复杂问题分解为一系列较为简单的局部最优选择,每一步的选择都是对当前解得一个扩展,直到的到问题的完整解,贪心法的典型应用是求解最优化问题,而且对于许多问题都能得到整体最优解,即使不能得到最优解,通常也是最优解的近似。——《算法设计与分析》我对贪心法的理解:说到贪心法,和动态规划有许多相同的地方,比如都是求最优解的算法,但是动态规划是通过找到动态规划方程,通过动态规划方程一步步推出最优解,而且一般都是最优解,每次决策和上一次决策有关系,具有很明确的求解目的;贪心法是通过用原创 2022-05-13 11:36:09 · 5185 阅读 · 0 评论 -
【动态规划】最长公共子序列
最长公共子序列给出两个序列text1和text2,要求求出这两个序列的最长公共子序列和最长公共子序列长度。**最长公共子序列的含义:**这里的子序列可以不是连续的,只要相对位置是符合的就算,比如abdfs和adef的最长公共子序列是adf。例题:求出acfsc(text1)和acs(text2)的最长公共子序列。1️⃣.划分子问题对于求text1和text2的最长公共子序列,从只有一个字符时候开始求解,求出只有一个字符的时候的最长公共序列,然后扩大问题,求出前两个字符的最长公共子序列,不断扩大问题原创 2022-04-27 19:58:27 · 982 阅读 · 0 评论 -
【动态规划】有向图的最短路径
无需多言,直接上代码🚀package com.dp;import java.util.Arrays;import java.util.Scanner;/** * @Author Lunau * @Create 2022-04-12 14:18 * @Description * input:6 8 * 0 1 2 * 0 2 3 * 1 3 1 * 1 4 5 * 2 3 3 * 2 4 2 * 3 5 6 * 4 5 7 * output: * →0→1→3→5 * 9原创 2022-04-15 10:40:29 · 1304 阅读 · 0 评论 -
第十三届蓝桥杯省赛Java-B组
第十三届蓝桥杯省赛Java-B组第一次参加蓝桥杯比赛,准备工作就是学了一点算法知识,刷了一些洛谷上的题,往年蓝桥杯都是五道填空五道程序设计,今年又改了,居然两道填空八道程序设计,这样对于往常一些通过不编程就可以写的填空题似乎不是太友好啊,有几道题之前写过类似的题,做着很顺手,总结下来还是要多刷题,多总结题啊。1️⃣星期计算这道题本来我想通过用excal中的日期公式计算,可惜结果太大,只能作罢,编程的方式也不难,用大数计算一下结果,对7求余数,得到的结果原来的星期六即可。答案:7package t原创 2022-04-09 18:43:24 · 1093 阅读 · 2 评论 -
【动态规划】01背包
⭐️动态规划-0/1背包什么是0/1背包问题,0/1背包问题是背包问题中一道重要的题目,大致意思是有n个物品,每个物品有重量w和价值v,要把这些物品中的一些物品放入容量为m的背包中,要求背包能放下而且其价值最大,0/1背包就是每个物品只有一个,只能是放或者不放。❓问题描述例题:给定一个背包,其容量为7,有4个物品,物品的重量和价值分别为{2,3,3,4},{5,10,15,20},每个物品最多只能放一次,要求放入背包中的物品的总价值最大,求出总价值。🍉分析对于动态规划的问题,还是先对问题进行划分原创 2022-04-06 15:49:57 · 1045 阅读 · 1 评论 -
【动态规划】数塔问题
❓问题描述给定一个数塔,从数塔的顶层出发,在每个结点可以选择向左或者向右走,一直走到最底层,要求找到一条路径,使得该路径上的数值和最大。以下图数塔为例。🤔如何求解这是一道动态规划的简单例子,一般来说,求解动态规划问题的步骤分为以下三个阶段:划分子问题,原问题可以划分成为多个子问题,每个子问题对应一个决策阶段,将问题的解决放在求解子问题上面。确定动态规划函数,根据子问题之间的关系找到子问题满足的递推关系式(连接大问题和小问题的桥梁)。填写表格,设计表格(相当于数组),根据原创 2022-03-29 13:00:31 · 5644 阅读 · 1 评论 -
【算法】求因数的算法优化
⭐️求因数的算法优化提起因数,小学就已经接触过了,就是能被整除的数,比如2能被8整除,那么2就是8的因数(怎么感觉在讲小学题呢🐾)那么给出一个求因数的案例:input:给定一个数,要求输出这个数的因数个数output:因数个数那么将求因数的过程转换成代码就像下面这样,这是最基础的求因数的方法,用一层for循环就可以实现,现在终点要说的是优化代码。🚀优化代码我觉得通过一个例子来说明优化代码的思想比较好理解思路比如求n的因数个数,首先对n开平方(这样就把问题的规模缩小了非常多,相当于把O(n)原创 2022-03-16 17:50:12 · 1684 阅读 · 0 评论 -
【归并排序】基础代码
🍋前言最近在学习分治法,涉及到之前学习的归并排序,当时学习数据结构的时候就归并排序背后的内容没有深究,过去留下的问题,在现在的使用中展现出不足,写下一些学习中的总结和思考,认真探讨归并排序。🤔算法思想归并排序是是分治法思想的典型代表,根据分治法的思想可以分为以下过程1.划分:将待排序序列划分1n划分成为两个长度相等的子序列1n/2和n/2+1到n2.求解子问题:分别对这两个子序列进行排序,的到两个有序的子序列3.合并:将这两个有序子序列合并成一个有序序列⭐️如何代码实现首先要将原始的序列原创 2022-03-11 19:21:10 · 892 阅读 · 2 评论 -
【快速排序】基础及代码优化
⭐️ 前言:快速排序算法的基本思想是,通过一趟排序将待排序记录分割成独立的两部分,其中一部分均比另一部分记录的关键字小,则可分别对着两部分记录进行排序,以达到整个序列有序的目的。快速排序其实采用的是分治法的思想:1.划分:选定一个记录作为轴值,以轴值为基准将整个序列划分为两个子序列,轴值的位置再划分过程中确定,并且前一个子序列的记录均小于或等于轴值,,后一个子序列中的记录均大于或等于轴值。2.求解子问题:分别对划分后的每一个子序列递归处理3.合并:由于对子序列的排序是就地进行的,所以合并不需要进原创 2022-03-10 16:21:53 · 549 阅读 · 0 评论 -
【递推与递归】【JAVA】P1002 [NOIP2002 普及组] 过河卒
思路:对于这道题,之前在写欧拉计划系列的时候曾经遇到过,当时用动态规划可以直接求出结果,这道题相当于是在基础上加了一个障碍点,在寻找路径的过程中需要跳过这些的障碍点,基本思路有了,接下来就认真分析一下怎么去实现这个算法。分析:1.状态转移方程在二维坐标系中寻找从A点到B点的所有路径,而且只允许往右和往下,每次只能走一步,A点到自身的路径只有一条,这里假设B坐标为(i,j),那么上一步到达B的方式只有两种(i-1,j)和(i,j-1),从A到达B的所有路径和是在上一次走的路径基础上求和,那么就可..原创 2022-03-09 15:50:10 · 452 阅读 · 0 评论 -
【模拟与高精度】【JAVA】P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two
题意:根据题意总结几点1.牛和Farmer John(简称猎人)移动的方式相同2.如果牛或者猎人当前移动一步的位置是障碍物或者边界就转向,不移动,否则移动一步3.转向为顺指针转向90度思路:这道题和求地雷阵那道题有一点相似,都是模拟地图类,这道题就是模拟牛和人在10*10的地图中运动的过程,关键在于模拟人和牛的移动,还有控制转向,因为不知道什么时候找到,所以用while循环,模拟移动的话,可以通过两组坐标值来模拟,转向也可以通过定义一个变量(0代表上,1代表右,2代表下,3代表左)来控制.原创 2022-01-20 20:43:34 · 324 阅读 · 0 评论 -
【模拟与高精度】【JAVA】P1563 [NOIP2016 提高组] 玩具谜题
点击原题目题意:模拟寻找眼镜的过程,通过小人的面向和提供的指令寻找眼镜。思路:存放数据通过两个String数组实现 通过题上给出的条件可以总结以下结论1.小人朝向圈内,左边是顺时针方向2.小人朝向圈内,右边是逆时针方向3.小人朝向圈外,左边是顺时针方向4.小人朝向圈外,右边是逆时针方向寻找眼镜的指令就这四种情况,但是通过观察可以发现,其中的1、3可以合并2、4也可以合并 这样就是两种情况了。1.圈内左边和圈外右边为顺时针,也就是小人朝向为0指令为0 和小人朝向为1 指令为12.圈内右边原创 2022-01-19 10:43:00 · 312 阅读 · 0 评论 -
算法-C语言-二分法查找
//二分法查找#include<stdio.h> //定义一个函数存放查找算法int binsearch(int x,int a[],int n) { int low,high,mid; //数组上下界初始化 low = 0,high = n-1; while(low<=high) { //求出中间元素的下标 mid = (low + high) / 2; if(x<a[mid]) { high = mid-1; } else if(x>a原创 2021-09-17 14:21:50 · 237 阅读 · 0 评论