算法题
追风者_
要我自我介绍,挺秃然的
展开
-
【最短路径之dijkstra算法】
还是拿这个题来分析dijkstra算法思路:是一个以出发路口为原点,不断扩充边直到将整个图联通的一个过程。开始构建连通图:一开始以出发点为原点,找到一个最邻近的点A,然后连接两点,构成一条边,这时候该点距离原点的距离就是该边权值,然后以该边A为端点,找出一个该点能联通的最短边,然后将新加入的点B更新它到原点的距离,即是原点—>A---->B的距离。这时候就叫做B和原点联通了。...原创 2020-02-23 12:25:02 · 172 阅读 · 0 评论 -
【LeetCode 3. 无重复字符的最长子串】 哈希 区间维护 O(n)算法
这道题刚拿过来,可能一开始想就会掉坑原创 2020-02-06 14:18:43 · 150 阅读 · 0 评论 -
【LeetCode 20.有效的括号】 栈方法 0ms
题意,问一组字符串能不能组成左右区间闭合的情况,且区间内不能有没有成对的,比如([])可以而( [ )就不行。思路:1.一开始想当然的以为只要左括号和右括号相等且遍历过程中右括号数量不能比左括号多就行,但是不能解决 ([ )]的这种情况(false),所以重新找了规律。2.就拿上面那个特殊情况的分析,我们发现我们只要出现了左括号(这里把开口向右的符号都称为左括号),如果要想让已经之前遍历...原创 2020-01-21 18:14:15 · 133 阅读 · 0 评论 -
【LeetCode】 137.只出现一次的数字 II (位运算)
这是一道位运算好题,下面说一下位运算的主要思路:1.因为只有一个数只出现了一次,而其他的数都出现了3次,那么在32位二进制数中,如果我们对每个数每一位出现1的个数进行统计,然后把这个结果%3后在放回这一位上,就得到了剩下的那个数在这个位上的数,什么意思呢?这里来举几个例子11011 11011 11011 01001这里三个重复的11011,我们先从最高位看,遍历完发现有三个...原创 2020-01-18 20:23:56 · 242 阅读 · 0 评论 -
SCAU 2019级寒假训练 E - Secret Origins 【位运算方法】
题意:找到一个最小的,比N大,且二进制中1的个数与N二进制中1的个数相同,的数。思路:在N的二进制中,从低位到高位,找到第一个出现01的位置,然后将01置为10,然后后面的全部变成0,这一步是控制比原来的数N大,相当于进了一位。比如N的二进制10111->11000,这是第一步,并且将原来的连续1区间存下来,用于等下后面添1,即是10111->00111;然后我们现在是想控制...原创 2020-01-16 10:58:54 · 218 阅读 · 0 评论 -
SCAU 2019级寒假训练 L - Bishops
我写的时候是拿着棋盘图观察了一下,下面是我的一些归纳结论:首先必须要得出的结论是,由于是对角线走法,黑白格肯定不能相通,一个坐标在白格上,另一个在黑格上的话,肯定就直接impossible了。那么,我们怎么知道坐标是对应黑格还是白格呢?其实,只要两个坐标成对角线关系,那么肯定满足坐标和或者差为一个定值,当对角线方向是左上到右下时,差为定值,当方向是左下到右上时,坐标和为定值。观察上图,...原创 2020-01-16 10:09:07 · 164 阅读 · 0 评论 -
SCAU ACM 校队寒训题A A - Hex-a-bonacci 【记忆化搜索】
题目给的暴力搜索肯定是超时代码,因为每次递归都会用重复运算。那么如何解决重复运算呢?那就把算过的值存起来就好啦。这里用迭代的方法写了,递归也一样。注意每一步都要取余#include <stdio.h>#include <string.h>#include <limits.h>int a, b, c, d, e, f;int dp[1000...原创 2020-01-12 20:29:52 · 310 阅读 · 0 评论 -
17080 拉丁矩阵问题 【回溯法 记忆化搜索】
基本思路:每行进行全排列,与前面的字典序全排列的一个不同就是这里的visited[][]数组要开成二维的,一个Visited[row][i]记录行里面的用过的数,另外一个Visited[i][col]用来记录列里面,确保无重复。同时,边界多了一种列到边界行没到的情况,这时候要继续traceback,只是列参数变为0,行参数+1。#include <stdio.h>#include...原创 2019-12-01 22:16:27 · 1828 阅读 · 0 评论 -
8636 跳格子 SCAU新生赛 {纯动态规划做法}
8636 跳格子看到也有人写过这道题题解,不过使用搜索+记忆化的,我这里提供一个纯动态规划的思路。1.确定状态,首先,它肯定跳到了最后一列格子上,至于哪个格子我先不管。2.那么它是怎么跳过来的呢?它是通过距离它根号k的范围内跳过来的,那我要使得我最后跳下去是最大的,那我我就要这个范围里面选一个最大的,这样我的状态转移方程就是dp[i][j]=max(范围内dp[][]最大值)+a[i][j...原创 2019-11-21 23:27:43 · 448 阅读 · 0 评论