刷题
bcsjnazmkascbdhb
这个作者很懒,什么都没留下…
展开
-
动态规划题目大总结(20217-27)
动态规划三步骤(1)定义数组的含义,不管是一维数组dp[i]还或者是二维数组dp[i][j],先声明代表的含义。(2)找出元素之间的关系式:dp[n],dp[n-1],dp[n-1]之间的关系。(3)找出初始值案例1:跳台阶扩展问题题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶(n为正整数)总共有多少种跳法。分析:青蛙跳一级台阶有一种,跳二级台阶可以先跳一级,也可以直接跳两级,跳三级可以先跳一级,那么剩下两个台阶就有两个台阶的跳的方法...原创 2021-07-28 09:43:56 · 152 阅读 · 0 评论 -
动态规划篇(2021-7-27)
动态规划1.动态规划的三大步骤定义(1)定义数组元素的含义,假设用一维数组dp[]保存历史数组,设置好dp[i]是代表什么意思。(2)找出数组元素之间的关系式:就是和归纳法相似,计算dp[n],利用dp[n-1],...dp[1],来推出dp[n],找出元素之间的关系。dp[n]=dp[n-1]+dp[n-2],(3)找出初始值。要知道初始值,dp[3]=dp[2]+dp[1]。要能直接获得dp[2]和dp[1]的初始值。2.案例案例1.一只青蛙一次可以跳上1级台阶,也可以跳上2级。求青蛙跳上原创 2021-07-27 10:18:48 · 92 阅读 · 0 评论 -
树的题(2021-7-25)
1.把二叉树打印成多行 class Solution{ public List<List<Integer>> levelOrder(TreeNode root){ List<List<Integer>> res=new ArrayList<>(); Queue<TreeNode> q=new LinkedList<>(); if(root!=null) q.add(root); w原创 2021-07-25 21:35:16 · 60 阅读 · 0 评论 -
树的题(2021-7-25)
1.二叉树的深度import java.util.Queue;import java.util.LinkedList;public class Solution{ public int TreeDepth(TreeNode root){ if(root == null) return 0; Queue<TreeNode> queue=new LinkedList(); queue.add(root); int high=0;原创 2021-07-25 10:30:00 · 85 阅读 · 0 评论 -
动态规划和树的题(2021-7-21)
1.二叉树中和为某一值得路径import java.util.ArrayList;public class Solution{ private ArrayList<ArrayList<Integer>> listAll=new ArrayList<>(); private ArrayList<Integer> list=new ArrayList<>(); public ArrayList<ArrayL原创 2021-07-21 11:57:15 · 83 阅读 · 0 评论 -
剩下的题(2021-7-20)
1.旋转数组的最小数字import java.util.ArrayList;public class Solution{ public int minNumberInRotateArray(int [] array){ if(array==null||array.length==0){return -1;} int left=0; int right=array.length-1; while(left<right){ int mid=(left原创 2021-07-20 11:25:38 · 70 阅读 · 0 评论 -
数学的题(2021-7-19)
1.不用加减乘除算加法public class Solution{ public int Add(int num1,int num2){ //利用位运算 while(num2!=0){ int temp=num1^num2; num2=(num1&num2)<<1; num1=temp; } return num1; }}思路:1.计算a和b的无进位,和进位原创 2021-07-19 19:32:35 · 78 阅读 · 0 评论 -
数学的题(2021-7-15)
1.丑数public class Solution{ public int GetUglyNumber_Solution(int index){ if(index<=0) return 0; int p2=0,p3=0,p5=0;//初始化三个指向三个潜在成为最小丑数的位置 int[] result=new int[index]; result[0]=1; for(int i=1;i<index;i++){ result[原创 2021-07-15 12:10:12 · 114 阅读 · 0 评论 -
数学类的题(2021-7-13)
1.二进制中1的个数public class Solution{ public int NumberOf1(int n){ int count=0; while(n!=0){ count++; n=(n-1)&n; } return count; }}思路:直接将整数看成二进制,然后采用移位的方法2.数值的整数次方public class Solution{ public double Power(doubl原创 2021-07-13 22:30:47 · 100 阅读 · 0 评论 -
递归的题(2021-7-11)
1.跳台阶public class Solution{ public int JumpFloor(int target){ int a=1,b=1; for(int i=1;i<target;i++){ a=a+b; b=a-b; } return a; }}思路:斐波那契思想1.从第n个台阶进行下台阶,下一步有2种可能,一种走到第n-1个台阶,一种是走到n-2个台阶。所以法f[n]=f[n-1]+f[n-2];1.初始条件f[0原创 2021-07-11 22:00:05 · 68 阅读 · 0 评论 -
排序和回溯题(2021-7-11)
1.最小的K个数class Solution{ //快排 public int[] getLeastNumbers(int[] arr,int k){ if(k==0||arr.length==0) return new int[0]; return qsk(arr,0,arr.length-1,k-1); } private int[] qsk(int[] nums,int l,int r,int k){ int j=qui原创 2021-07-11 19:43:46 · 75 阅读 · 0 评论 -
队和栈的题(2021-7-11)
1.二叉搜索树的后序遍历序列import java.util.Arrays;public class Solution{ public boolean VerifySquenceOfBST(int [] sequence){ if(sequence==null||sequence.length==0) return false; return helpVerify(sequence,0,sequence.length-1);//(数组名称,起始位置为0,终止位置为sequence.l原创 2021-07-11 16:53:33 · 78 阅读 · 0 评论 -
队和栈的题(2021-7-9)
1.用两个栈实现队列import java.util.Stack;public class Solution{ Stack<Integer> stack1=new Stack<Integer>(); Stack<Integer> stack2=new Stack<Integer>(); public void push(int node){ stack1.push(node); } public int pop() throws原创 2021-07-09 17:14:48 · 81 阅读 · 0 评论 -
数组题(2021-7-7)
1.和为S的两个数import java.util.ArrayList;public class Solution{ public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum){ ArrayList<Integer> res=new ArrayList<>(); int i=0,j=array.length-1; int ij=Integer.MAX_VALU原创 2021-07-08 15:39:52 · 85 阅读 · 0 评论 -
数组题(2021-7-3)
1.把数组排成最小的数import java.util.ArrayList;public class Solution{ public String PrintMinNumber(int [] numbers){ if(numbers==null||numbers.length==0) return ""; //快排 for(int i=0;i<numbers.length;i++){ for(int j=i+1;j<numbers.length;j++){原创 2021-07-03 17:17:03 · 76 阅读 · 0 评论 -
数组题(2021-7-2)
1.调整数组顺序使奇数位于偶数前import java.util.*;public class Solution{ public int[] reOrderArray(int[] array){ if(array.length==0) return array; Queue<Integer> jishu=new LinkedList<>(); Queue<Integer> oushu=new LinkedList<>原创 2021-07-02 16:12:31 · 80 阅读 · 0 评论 -
数组题(2021-7-1)
1.二维数组中的查找public class Solution{ public boolean Find(int target,int [][] array){ int row=0; int col=array[0].length-1; while(row<=array.length-1&&col>=0){ if(target==array[row][col]){ return true; }else if(targe原创 2021-07-01 20:05:29 · 65 阅读 · 0 评论 -
字符串题(2021-6-30)
1.链表中环的入口结点public class Solution{ public ListNode EntryNodeOfLoop(ListNode pHead){ if(pHead==null||pHead.next==null) return null; ListNode slow=pHead;//定义一个慢指针 ListNode fast=pHead;//定义一个快指针 while(fast!=null&&fast.next!=null){原创 2021-06-30 21:30:43 · 79 阅读 · 0 评论 -
链表题(2021-6-29)
1.合并两个排序的链表public class Solution{ public ListNode Merge(ListNode list1,ListNode list2){ ListNode preHead=new ListNode(-1);//创建一个头节点,归一化操作,否则第一个加入的节点还要单独做 ListNode pre=preHead;//两个指针一个指向头节点,一个指向尾节点 while(list1!=null&&list2!=null){//当list1和l原创 2021-06-29 15:17:29 · 81 阅读 · 0 评论 -
链表题(2021-6-28)
1.从尾到头打印链表import java.util.ArrayList;public class Solution{ public ArrayList<Integer> printListFormTailToHead(ListNode listNode){ ArrayList<Integer> list=new ArrayList<Integer>();//创建一个list集合 if(listNode!=null){//listNode链表节点不为空原创 2021-06-28 20:28:39 · 60 阅读 · 0 评论 -
字符串题(2021-6-24)
1.第一个只出现一次字符的位置import java.util.*;public class Solution{ public int FirstNotRepeatingChar(String str){ if(str==null||str.length()==0) return -1; char[] c=str.toCharArray();//将字符串数组转换成字符串 LinkedHashMap<Character,Integer> hash=new原创 2021-06-24 22:43:02 · 153 阅读 · 0 评论 -
字符串题(2021-6-22)
1.把字符串转换成整数public class Solution{ public int StrToInt(String str){ if(str==null||str.length()==0) return 0; int mark=0; int number=0;//用int来存储,以防止越界 if(str.charAt(0)=='-') mark=1;//charAt:返回指定索引处(0)的字符为-,则mark=1 for(int i=mark原创 2021-06-22 15:54:34 · 78 阅读 · 0 评论 -
字符串题(2021-6-21)
1.翻转单词序列public class Solution{ public String ReverseSentence(String str){ if(str==null||str.length()==0) return str; char[] arr=str.toCharArray();//转换成字符串 reverse(arr,0,arr.length-1);//先全部翻转一次 int start=0; int end=0; while(原创 2021-06-22 00:06:18 · 117 阅读 · 0 评论 -
LeetCode--删除排序数组中的重复项(35)
删除排序数组中的重复项题目:给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例 1: 给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。思路:(1)假设前提条件:数组是有序的,那么重复元素一定原创 2020-12-04 09:35:11 · 94 阅读 · 0 评论 -
LeetCode--合并两个有序链表(34)
合并两个有序链表题目:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4思路:1.先判断l1和l2是否为空链表。 2.如果l1和l2一开始为空链表,那么没有任何操作需要合并,所以只需要返回非空链表。 3.判断l1和l2哪一个链表的头节点的值更小,然后递归的决定下一个添加到结果里的节点。 4.如果两个链表有一个原创 2020-11-27 21:10:08 · 122 阅读 · 0 评论 -
LeetCode--两个数组的交集(33)
两个数组的交集题目:给定两个数组,编写一个函数来计算它们的交集。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2]思路:计算两个数组的交集,先是遍历数组nums1,对于其中的每个元素,遍历数组nums2,判断该元素是否存在nums2中,如果存在,将该元素添加到返回值。1.首先使用两个集合分别存储两个数组中的元素。2.然后遍历两个集合中的元素,并比较两个集合的长度。3.然后遍历较小的集合,判断其中的每个元素是否在另一个集合中。4.创建一个新的集合,原创 2020-11-26 21:19:18 · 106 阅读 · 0 评论 -
LeetCode--爬楼梯(32)
爬楼梯题目:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。 示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶思路:1.爬到第x级台阶的方案数是爬到第x-1级台阶的方案数和爬到第x-2级台阶的方案数的和。(每次只能爬1级或2级)复杂度分析时间复杂度:循环执行 nn 次,每次花费常数的时间代价,故渐进时间复杂度原创 2020-11-25 19:33:07 · 99 阅读 · 0 评论 -
LeetCode--x的平方根(31)
x的平方根题目:实现 int sqrt(int x) 函数。 计算并返回 x 的平方根,其中 x 是非负整数。 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。 示例 1:输入: 4输出: 2思路:1.通过其他数学函数代替平方根函数得到精确结果,取整数部分作为答案;2.通过数学方法得到近似结果,直接作为答案复杂度分析时间复杂度:O(1)空间复杂度:O(1)...原创 2020-11-24 21:26:41 · 74 阅读 · 0 评论 -
LeetCode--二叉树搜索树中第K小的元素(30)
二叉树搜索树中第K小的元素题目:给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。 说明: 你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。示例 1: 输入: root = [3,1,4,null,2], k = 1 3 / \ 1 4 \ 2输出: 1思路:1.在栈的帮助先,可以迭代,这样可以加快速度,这样不用遍历整个树 1.创建一个栈 LinkedList<TreeN原创 2020-11-24 20:22:13 · 137 阅读 · 0 评论 -
LeetCode--搜索二维矩阵2(29)
搜索二维矩阵题目:编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]]思路:1.初始化一个指向矩阵左下角原创 2020-11-23 20:33:53 · 95 阅读 · 0 评论 -
LeetCode--搜索插入位置(28)
搜索插入位置题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 你可以假设数组中无重复元素。示例 1:输入: [1,3,5,6], 5输出: 2思路:在排序数组中寻找是否存在一个目标值,那么就用二分法。在O(logn)的时间内找到是否存在目标值。本题额外条件,如果不存在数组中的时候,需要返回按顺序插入的位置,还是可以用二分法。只需要考虑插入位置。成立的条件为:nums[pos-1]<r=target≤原创 2020-11-20 19:25:31 · 107 阅读 · 0 评论 -
LeetCode--多数元素(27)
多数元素题目:给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1: 输入: [3,2,3] 输出: 3思路:如果将数组nums中的所有元素按照单调递增或单调递减的顺序排序,那么下标为[n/2]的元素(下标从0开始)一定是众数。1.先将nums数组排序。2.找到下标为[n/2]的数。复杂度分析时间复杂度:O(nlogn)。将数组排序的时间原创 2020-11-20 14:53:41 · 81 阅读 · 0 评论 -
LeetCode--最大子序和(26)
最大子序和题目:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例: 输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。思路:分治算法求解,不是最优解1.动态规划的是首先对数组进行遍历,当前最大连续子序列和为sum,结果为ans2.如果sum>0,则说明sum对结果有增益效果,则sum保留并加上当前遍历数字3.如果sum<0,原创 2020-11-20 10:56:39 · 85 阅读 · 0 评论 -
LeetCode--根据身高重建队列(25)
根据身高重建队列题目:假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对 (h, k) 表示,其中 h 是这个人的身高,k 是应该排在这个人前面且身高大于或等于 h 的人数。 例如:[5,2] 表示前面应该有 2 个身高大于等于 5 的人,而 [5,0] 表示前面不应该存在身高大于等于 5 的人。 编写一个算法,根据每个人的身高 h 重建这个队列,使之满足每个整数对 (h, k) 中对人数 k 的要求。思路:1.将每个人按照身高从大到小进行排序,处理身高相同的人使用的方法类似,即:按原创 2020-11-18 22:29:57 · 108 阅读 · 0 评论 -
LeetCode--摆动序列(24)
摆动序列题目:如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。 例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。 给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始原创 2020-11-16 21:20:55 · 75 阅读 · 0 评论 -
LeetCode--去除重复字母(23)
去除重复字母题目:给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。示例 1:输入:s = "bcabc"输出:"abc"思路:1.用栈存储当前遍历元素。2.如果当前元素未被访问过,则判断其字典序是否小于栈顶元素而且栈顶元素在以后还会出现;3.如果小于,则弹出当前栈顶,继续进行判断(为了获取字典序最小的序列)4.如果不满足上述条件,直接将其加入栈中即可5.最后将栈中字符转换成字符串即可复杂度分析原创 2020-11-16 19:31:18 · 264 阅读 · 0 评论 -
LeetCode--加油站(22)
加油站题目:在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。 如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。 示例 1:输入: gas = [1,2,3,4,5]cost = [3,4,5,1,2]输出: 3解释:从 3 号加油站(索引为 3 处)出发,可获得 4原创 2020-11-16 17:08:58 · 82 阅读 · 0 评论 -
LeetCode--跳跃游戏(21)
跳跃游戏题目:给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个位置示例 1: 输入: [2,3,1,1,4] 输出: true 解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。贪心算法思路:最大跳跃长度为x+nums[x] a.对于数组中任意一个位置y,如何判断是否可以到达。 b.存在一个原创 2020-11-15 23:07:46 · 92 阅读 · 0 评论 -
LeetCode-买卖股票的最佳时机含手续费(20)
买卖股票的最佳时机含手续费题目:给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。 可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。 返回获得利润的最大值。示例 1:输入: prices = [1, 3, 2, 8, 4, 9], fee = 2输出: 8解释: 能够达到的最大利润: 在此处买入 prices[0] = 1在此处卖出原创 2020-11-06 20:02:30 · 150 阅读 · 1 评论 -
LeetCode--删列造序(19)
删列造序题目:给定由 N 个小写字母字符串组成的数组 A,其中每个字符串长度相等。 需要选出一组要删掉的列 D,对 A 执行删除操作,使 A 中剩余的每一列都是 非降序 排列的,然后请你返回 D.length 的最小可能值。 删除 操作的定义是:选出一组要删掉的列,删去 A 中对应列中的所有字符,形式上,第 n 列为 [A[0][n], A[1][n], ..., A[A.length-1][n]]。 给定由 N 个小写字母字符串组成的数组 A,其中每个字符串长度相等。示例原创 2020-11-06 20:00:35 · 121 阅读 · 0 评论