![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
lilun1231
这个作者很懒,什么都没留下…
展开
-
leetcode算法题-剑指Offer篇(24)
1、构建乘积数组1.1 题目描述:给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B 中的元素 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。1.2 题解1.2.1根据表格的主对角线(全为 11 ),可将表格分为 上三角 和 下三角 两部分。分别迭代计算下三角和上三角两部分的乘积,即可 不使用除法 就获得结果public int[] constructArr(int[] a) { i原创 2020-09-03 22:13:34 · 95 阅读 · 0 评论 -
leetcode算法题-剑指Offer篇(23)
1、 股票的最大利润1.1 题目描述:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?1.2 题解1.2.1 动态规划状态定义: 设动态规划列表 dp ,dp[i] 代表以 prices[i]为结尾的子数组的最大利润(以下简称为 前 i 日的最大利润 )。转移方程: 由于题目限定 “买卖该股票一次” ,因此前 i日最大利润 dp[i] 等于前 i - 1 日最大利润 dp[i-1] 和第 i 日卖出的最大利润中的最大值。前i日最大利润=max原创 2020-09-03 21:18:25 · 103 阅读 · 0 评论 -
leetcode算法题-剑指Offer篇(22)
1、 n个骰子的点数1.1 题目描述:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率1.2 题解1.2.1...原创 2020-09-02 20:11:17 · 94 阅读 · 0 评论 -
leetcode算法题-剑指Offer篇(21)
1、 左旋转字符串1.1 题目描述:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。1.2 题解1.2.1 切片 public String reverseLeftWords(String s, int n) { return s.substring(n, s.length()) + s.substring(0, n);原创 2020-08-31 20:44:51 · 154 阅读 · 0 评论 -
leetcode算法题-剑指Offer篇(20)
1、 和为s的两个数字1.1 题目描述:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。1.2 题解1.2.1 双指针 public int[] twoSum(int[] nums, int target) { int i = 0, j = nums.length - 1; int[] res = null; while (i < j) {原创 2020-08-30 20:27:42 · 84 阅读 · 0 评论 -
leetcode算法题-剑指Offer篇(19)
1、平衡二叉树1.1 题目描述:输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树1.2 题解1.2.1 深度遍历,从底至顶 public boolean isBalanced(TreeNode root) { return help(root)!=-1; } //用left,right记录root左右子节点的深度,避免遍历root时对左右节点的深度进行重复计算。 //考虑到需要原创 2020-08-28 22:49:27 · 75 阅读 · 0 评论 -
leetcode算法题-剑指Offer篇(18)
1、0~n-1中缺失的数字1.1 题目描述:一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。1.2 题解1.2.1 二分法 public int missingNumber(int[] nums) { int i=0,j=nums.length-1; while(i<=j){ int mid=(i+j)/2;原创 2020-08-28 19:46:16 · 982 阅读 · 0 评论 -
leetcode算法题-剑指Offer篇(1)
leetcode算法题-剑指Offer篇(1)1、找出数组中重复的数字1.1 题目描述:在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。1.2 题解1.2.1 利用map结构 public int findRepeatNumber(int[] nums) { if (nums.length == 0) return原创 2020-07-29 21:06:24 · 102 阅读 · 0 评论 -
leetcode算法题-剑指Offer篇(2)
leetcode算法题-剑指Offer篇(2)1、 从尾到头打印链表1.1 题目描述:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。1.2 题解1.2.1 创建数组保存链表节点值,对数组进行反转; public int[] reversePrint(ListNode head) { if(head==null) return new int[0];//如果头结点为空,返回空数组 ListNode index =原创 2020-08-01 14:34:16 · 92 阅读 · 0 评论 -
leetcode算法题-剑指Offer篇(3)
1、 斐波那契数列1.1 题目描述:写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。1.2 题解1.2.1 递归,用数组、map保存计算过的值,避免重复计算 int constant = 1000000007;//防止溢出 publ原创 2020-08-05 21:40:20 · 133 阅读 · 0 评论 -
leetcode算法题-剑指Offer篇(4)
1、 矩阵中的路径1.1 题目描述:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。[[“a”,“b”,“c”,“e”],[“s”,“f”,“c”,“s”],[“a”,“d”,“e”,“e”]]但矩阵中不包含字符串“abfb”的路径,因为字符串原创 2020-08-05 23:45:21 · 138 阅读 · 0 评论 -
leetcode算法题-剑指Offer篇(5)
1、 二进制中1的个数1.1 题目描述:请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。1.2 题解1.2.1 逐位判断根据 与运算 定义,设二进制数字 nn ,则有: 若 n & 1 = 0n&1=0 ,则 nn 二进制 最右一位 为 00 ; 若 n& 1 = 1n&1=1 ,则 nn 二进制 最右一位 为 11 。 根据以上特点,考虑以下 循原创 2020-08-06 23:19:23 · 97 阅读 · 0 评论 -
leetcode算法题-剑指Offer篇(7)
1、调整数组顺序使奇数位于偶数前面1.1 题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。1.2 题解1.2.1 双指针 public int[] exchange(int[] nums) { if (nums.length <= 1) return nums; int i = 0, j = nums.length - 1; wh原创 2020-08-11 22:18:32 · 99 阅读 · 0 评论 -
leetcode算法题-剑指Offer篇(8)
1、合并两个排序的链表1.1 题目描述:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。1.2 题解1.2.1新建链表,引入伪头结点 public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode result = new ListNode(0), cur = result; while(l1 != null && l2 != null) {原创 2020-08-12 22:32:09 · 117 阅读 · 0 评论 -
leetcode算法题-剑指Offer篇(9)
1、对称的二叉树1.1 题目描述:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。1.2 题解1.2.1递归 public boolean isSymmetric(TreeNode root) { if(root==null) return true; return help(root.left,root.right); } public boolean help(Tree原创 2020-08-13 23:11:47 · 91 阅读 · 0 评论 -
leetcode算法题-剑指Offer篇(10)
1、栈的压入、弹出序列1.1 题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。1.2 题解1.2.1初始化: 辅助栈 stackstack ,弹出序列的索引 ii ; 遍历压栈序列: 各元素记为 numnum ; 元素 numnum入栈; 循环原创 2020-08-17 21:42:02 · 88 阅读 · 0 评论 -
leetcode算法题-剑指Offer篇(11)
1、二叉搜索树的后序遍历序列1.1 题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。1.2 题解1.2.1 递归后序遍历定义: [ 左子树 | 右子树 | 根节点 ] ,即遍历顺序为 “左、右、根” 。二叉搜索树定义: 左子树中所有节点的值 << 根节点的值;右子树中所有节点的值 >> 根节点的值;其左、右子树也分别为二叉搜索树。 public b原创 2020-08-18 22:21:10 · 97 阅读 · 0 评论 -
leetcode算法题-剑指Offer篇(12)
1、二叉搜索树与双向链表1.1 题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。1.2 题解1.2.1后使用list保存中序遍历后的节点,之后再对list中的节点进行处理 public Node treeToDoublyList(Node root) { ArrayList<Node> list = new ArrayList<>(); if(roo原创 2020-08-19 21:55:25 · 93 阅读 · 0 评论 -
leetcode算法题-剑指Offer篇(13)
1、数组中出现次数超过一半的数字1.1 题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。1.2 题解1.2.1 摩尔投票法 public int majorityElement(int[] nums) { int i=0,vote=0; for(int num :nums){ if(vote==0)i=num ; vote+=(num ==i)?1:-1; }原创 2020-08-20 21:31:31 · 164 阅读 · 0 评论 -
leetcode算法题-剑指Offer篇(14)
1、连续子数组的最大和1.1 题目描述:输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。时间复杂度为O(n)。1.2 题解1.2.1 动态规划 public int maxSubArray(int[] nums) { int res=nums[0]; for(int i=1;i<nums.length;i++) { if(nums[i-1]>0)原创 2020-08-21 21:58:28 · 166 阅读 · 0 评论 -
leetcode算法题-剑指Offer篇(15)
1、把数组排成最小的数1.1 题目描述:输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。1.2 题解1.2.1 快速排序 public String minNumber(int[] nums) { String[] strs = new String[nums.length]; for(int i = 0; i < nums.length; i++) strs[i] = String.原创 2020-08-24 19:57:17 · 101 阅读 · 0 评论 -
leetcode算法题-剑指Offer篇(16)
1、最长不含重复字符的子字符串1.1 题目描述:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。1.2 题解1.2.1 动态规划 + 哈希表 public int lengthOfLongestSubstring(String s) { Map<Character, Integer> dic = new HashMap<>(); int res = 0, tmp = 0; for(int j原创 2020-08-25 21:40:34 · 105 阅读 · 0 评论 -
leetcode算法题-剑指Offer篇(17)
1、数组中的逆序对1.1 题目描述:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。1.2 题解1.2.1 暴力求解 public int reversePairs(int[] nums) { int count=0; for(int i=0;i<nums.length-1;i++){ for(int j=i+1;j<nums.length;j++)原创 2020-08-27 22:16:04 · 118 阅读 · 0 评论