数据结构与算法
HarryXxc
这个作者很懒,什么都没留下…
展开
-
python创建多维数组中的浅拷贝问题
python创建多维数组原创 2022-10-28 10:36:32 · 432 阅读 · 0 评论 -
二分查找的小问题
代码如下public int search(int[] nums, int target) { int start = 0; int end = nums.length-1; int mid = 0; while(start<=end){ mid = start + (end - sta...原创 2020-02-12 11:06:48 · 176 阅读 · 0 评论 -
关于二分查找遇到的坑(用sqrt(x)举例)
首先贴上我的代码public class Solution { public int mySqrt(int x) { //这里必须要把x=0的情况给考虑进去,因为下面我使用的是除法; //其实如果这里用位运算符会更加快 if (x == 1 || x == 0) { return x; } long ...原创 2019-12-09 20:08:17 · 217 阅读 · 0 评论 -
0-1背包/完全背包问题优化
上一篇博客中写道0-1背包问题,同时也给出了状态转移方程,但是空间复杂度还是比较高的。附上博客链接:彻底搞懂0-1背包问题(动态规划)0-1背包问题的优化。我们可以看到更新后的最大价值 dp[i][j] 是根据当前的最大值和前一行的状态得到的。...原创 2020-06-08 21:56:41 · 986 阅读 · 1 评论 -
彻底搞懂0-1背包问题(动态规划)
看了很多网上的博客,发现对于0-1背包问题很多讲的都很专业,初学者学起来还是比较吃力,今天我就用最简单最形象的语言来描述一下0-1背包问题,为什么不能用贪婪算法,而要选择使用动态规划。首先对于0-1背包问题,我们需要知道的是:每一个物品只有1个,要么全拿,要么不拿,最后使得拿到的物品的总价值最大。假如一个小偷有一个可以容纳4千克的背包,但是发现面前只有有3样物品可以偷:台灯(30元,4千克)、音响(20元,3千克)、充电宝(15元,1千克)(价格和重量可能有点奇怪????)。问,小偷能够偷到的物品的原创 2020-05-29 17:26:18 · 29359 阅读 · 45 评论 -
leetcode之前缀和
在动态规划中我们经常会用到前缀和这个方法,我们先来简单看个例子。借用leetcode第560题:和为k的子数组:给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。示例:输入:nums = [1,1,1], k = 2输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。其实很容易想到的是暴力求解,但是时间复杂度为O(n2n^2n2),所以我们这里直接讲解前缀和;我们遍历每一个数组,定义一个 preSum[i] 将数组下标在[0…i]之间的和保存起.原创 2020-05-27 17:43:48 · 1155 阅读 · 0 评论 -
leetcode之判断环形链表以及入环点,简单易懂!
面试的时候经常会遇到要判断一个链表是否有环,今天就来总结一下如何判断一个链表是否有环,以及链表环长、链表的入环点。首先我们来看一下如何判断链表是否有环1.利用哈希表我们可以在遍历的时候将每一个链表节点存入到哈希表中,然后在遍历的过程中寻找是否有这个节点了,如果有,那就是环形链表,如果没有,继续遍历,直到链表节点为空(null)。这个思路很简单也很容易懂,我们直接看代码。public boolean hasCycle(ListNode head) { Set<ListNode&g.原创 2020-05-26 15:46:55 · 755 阅读 · 1 评论 -
leetcode之石子游戏(博弈类动态规划)
这是一道博弈类的动态规划题目,题目假设两者都能发挥出最佳水平,那么这题如果用贪心算法(每次选取最左边和最右边的最大值)其实是不行的,比如[1,100,3];不管先手一开始拿的是最左边的1还是最右边的3,那么后手都能拿到100,后手就会赢。所以这里我们采用动态规划去解决。思路如下:(毕竟是动态规划,那我们就按照动态规划的三步来走)首先就是定义状态dp[i][j],用来表示在i~j堆石子中,亚历克斯比李多拿的石子。一般来说动态规划,我们看看是不是很明显的二维动态数组,如果是的话我们先直接定义二维数组..原创 2020-05-23 16:32:38 · 1028 阅读 · 1 评论 -
leetcode之除数博弈
原题链接这道题我看到leetcode上有个巧妙解法,利用N的奇偶性就可以判断先手的输赢;1. 最终结果应该是谁先占到 2 谁就赢;2. 若当前为奇数,奇数的约数只能是奇数或者 1,因此下一个一定是偶数;3. 若当前为偶数,偶数的约数可以是奇数可以是偶数也可以是 1,所以为保证胜利,因此直接减 1,则下一个是奇数;4. 因此,奇则输,偶则赢。直接:代码如下:class Solution { public boolean divisorGame(int N) { r原创 2020-05-14 23:13:49 · 364 阅读 · 2 评论 -
PAT打卡--L1-016查验身份证(c++)
原题链接-这道题其实也是一道简单题,我主要还是用其来学习C++,通过这道题,了解到了c++中的字符和int之间的转换,首先贴上代码吧#include<iostream>#include<vector>#include<string>using namespace std;int main(){ int n; cin >> n; string s[n]; vector<string > err;//保存错误的号码 for(i.原创 2020-05-14 12:41:06 · 434 阅读 · 0 评论 -
PTA打卡--个位数统计(java && c++)
原题链接方法一,我们使用最简单的list + map集合import java.util.*;public class Main{ public static void main(String[] args) { Scanner in = new Scanner(System.in); String n = in.nextLine(); HashMap<Integer,Integer> map = new HashMap();原创 2020-05-11 21:39:49 · 582 阅读 · 0 评论 -
leetcode之机器人运动范围
地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少...原创 2020-04-08 21:07:29 · 328 阅读 · 0 评论 -
leetcode之栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]输出:true...转载 2020-04-06 12:37:23 · 288 阅读 · 0 评论 -
序列和问题
链接:https://www.nowcoder.com/questionTerminal/46eb436eb6564a62b9f972160e1699c9来源:牛客网给出一个正整数N和长度L,找出一段长度大于等于L的连续非负整数,他们的和恰好为N。答案可能有多个,我我们需要找出长度最小的那个。例如 N = 18 L = 2:5 + 6 + 7 = 183 + 4 + 5 + 6 = 1...原创 2020-04-05 16:24:34 · 336 阅读 · 0 评论 -
leetcode之回文总结(一)
回文数简单来说就是指正序(从左向右)和倒序(从右向左)读都是一样的整数。如果是判断一个数是不是回文,我们很容易想到的就是利用双指针,那么如果题目给你的本身就是字符串那好比较容易操作,直接利用一个头指针指向字符串的头部,利用一个尾指针指向字符串的尾部,然后判断这两个指针指向的字符是否一致,不一致直接返回false;一致情况下,两个指针同时向中间移动,继续以上操作。但是如果给你的是数字,那么也可...原创 2020-04-03 12:08:30 · 209 阅读 · 0 评论 -
leetcode之重建二叉树
最头疼的就是做树的题目了,虽然说遇到树,想到的就是递归,想到的就是深度优先搜索,但是总感觉没有get到它的精华所在。输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9...原创 2020-04-02 13:03:01 · 231 阅读 · 0 评论 -
leetcode之从头到尾打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。输入:head = [1,3,2]输出:[2,3,1]说实话,这个题目还是比较简单的,但是我个人感觉其实还是有点小技巧在里面,看到官方题解以及许多大佬们的解法都是使用了栈或者递归。/** * Definition for singly-linked list. * public class ListNode {...原创 2020-04-02 11:15:53 · 226 阅读 · 0 评论 -
leetcode之生命游戏
给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1 即为活细胞(live),或 0 即为死细胞(dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;如果活细胞周围八个位置有超...原创 2020-04-02 10:59:07 · 265 阅读 · 0 评论 -
二维数组中的查找
在一维数组中查找一个数有很多办法,比如最简单的暴力查找,或者排序之后在利用二分查找,如果涉及到二维数组,其实原理还是一样的。在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。[ [1, 4, 7, 11, 15], [2, 5, 8, 1...原创 2020-04-01 12:38:47 · 155 阅读 · 0 评论 -
查找数组中重复的数字
找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3 来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/shu-...原创 2020-04-01 11:45:59 · 1693 阅读 · 0 评论 -
leetcode回溯算法总结(一)
这几天学了一下回溯算法,也看了一些题目,总结下就是以后遇到需要枚举,然后结果可能就是两种分支的时候,考虑一下是不是适合用回溯法给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。输入: 12258输出: 5解...原创 2020-03-31 16:49:07 · 247 阅读 · 0 评论 -
寻找数据流中的中位数总结(一)
一看到找某一数组中的中位数我们就很容易想到的方法:将数组排序,然后直接利用数组的长度÷2就可以获得中位数了。 比如说给你一个数组 arr=[1,6,3,8,2,9,14,5];让你找到他的中位数,我们很容易想到以下代码: public int findMidNum(int[] arr){ Arrays.sort(arr);//默认对数组进行从小到大排序 return arr[ar...原创 2020-03-30 21:33:04 · 1223 阅读 · 1 评论 -
leetcode之动态规划小结(一)
最近学习动态规划有点吃力,感觉这个东西虽然说是有套路的,但是刚开始的时候还是觉得难。现在网上也有很多讲动态规划的原理以及做法的,我就不多说了,主要还是以例子来记录一下最近的心得。首先就是leetcode上的打家劫舍这道题目,原题如下你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚...原创 2020-03-26 11:44:32 · 169 阅读 · 0 评论 -
leetcode之链表的中间节点总结
给定一个带有头结点 head 的非空单链表,返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 “给定链表的结点数介于 1 和 100 之间。”1.输入:[1,2,3,4,5] 输出:此列表中的结点 3 (序列化形式:[3,4,5])2.输入:[1,2,3,4,5,6] 输出:此列表中的结点 4 (序列化形式:[4,5,6]) 附上原题链接这是一个典...原创 2020-03-23 19:19:03 · 214 阅读 · 0 评论