![](https://img-blog.csdnimg.cn/20201207125246798.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法与数据结构
做一点算法咯
TinhTinh
为了爱孤军奋斗
展开
-
两句话中不常见单词884
题目描述:句子 是一串由空格分隔的单词。每个 单词 仅由小写字母组成。如果某个单词在其中一个句子中恰好出现一次,在另一个句子中却 没有出现 ,那么这个单词就是 不常见的 。给你两个 句子 s1 和 s2 ,返回所有 不常用单词 的列表。返回列表中单词可以按 任意顺序 组织。题目思路:两个句子中只能出现一次单词则是结果,那么可以用map统计,key为单词,value为次数,遍历map找到次数为1的单词就是答案。代码:package simple;import java.util.*原创 2022-05-11 13:01:09 · 167 阅读 · 0 评论 -
反转字符串中的单词 III 557
题目描述:定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。提示:1 <= s.length <= 5 * 104s 包含可打印的 ASCII 字符。s 不包含任何开头或结尾空格。s 里 至少 有一个词。s 中的所有单词都用一个空格隔开。题目思路:开辟一个stringBuffer 用来拼接最后的结果。当遍历到空格时便知道是一个单词的末尾。此时逆序添加这个单词的字母到Buffer中。 public static String原创 2022-04-16 21:05:40 · 423 阅读 · 0 评论 -
翻转字符串344
题目描述:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。题目思路:一个头指针,一个尾指针,两个指针不断移动并交换。代码实现: public void reverseString(char[] s) { int left = 0, right = s.length -1; while (left <= right)原创 2022-04-10 10:41:03 · 197 阅读 · 0 评论 -
两数之和‖ 167
题目描述:给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。你可以假设每个输入 只对应唯一原创 2022-04-10 10:02:22 · 253 阅读 · 0 评论 -
移动零283
题目描述:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。思路一: 双指针定义一个left和right都指向数组开头,不断右移right , 当遇见非零数则和left位置交换,同时left前进 // 思路一 : 双指针 public void moveZeroes(int[] nums) { int n = nums.length; int left原创 2022-04-05 21:21:13 · 140 阅读 · 0 评论 -
轮转数组189
轮转数组题目描述:给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。输入: nums = [1,2,3,4,5,6,7], k = 3输出: [5,6,7,1,2,3,4]思路一:使用额外的数组新建一个数组,将原数组i 位置的值赋值到新数组(i+k)%n位置,最后拷贝到原数组就行 public static void rotate(int[] nums, int k) { int n = nums.length; int[] new原创 2022-04-04 13:04:56 · 316 阅读 · 0 评论 -
有序数组的平方977
有序数组的平方题目描述:给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。思路1:直接给每个元素平方,然后排序. public int[] sortedSquares(int[] nums) { // 将每个数平方 for(int i = 0; i< nums.length;i++){ nums[i] = nums[i]*nums[i]; }原创 2022-04-02 20:36:35 · 331 阅读 · 0 评论 -
二分查找704(简单)
二分查找(简单)题目描述给定一个n个元素有序的(升序)整型数组nums 和一个目标值target,写一个函数搜索nums中的 target,如果目标值存在返回下标,否则返回 -1。代码实现 public int search(int[] nums, int target) { int low = 0, high = nums.length - 1; while (low <= high) { int mid = (high - low) / 2 + low;原创 2022-03-30 11:03:39 · 86 阅读 · 0 评论 -
剑指offer- 二叉树的深度
二叉树的深度题目描述:输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。题目思路:树的遍历方式分为两种:深度优先遍历(DFS),广度优先遍历(BFS)方法一:深度优先,后序遍历树的深度等于左子树深度和右子树深度最大值加1class Solution1 { public int maxDepth(TreeNode root) { if(root == null){原创 2021-03-16 22:53:37 · 75 阅读 · 0 评论 -
对称的二叉树
题目描述:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。题解: public boolean isSymmetric(TreeNode root){ // 如果根节点空 返回true 否则递归判断 左右节点 return root == null ? true : recur(root.left, root.right); } private boolean recur(TreeNode left,原创 2021-01-07 15:10:03 · 56 阅读 · 0 评论 -
Java学算法之数组中的重复数字
剑指offer003—数组中的重复数字题目描述:在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。解法:一、Map把数组遍历到map当发现已经包含数值时退出。public int findRepeatNumber(int[] nums) { /** 将数组遍历到map,key为数值,v为次数。 当包含重复ke原创 2020-07-25 12:08:45 · 99 阅读 · 0 评论 -
二叉树的最近公共祖先
二叉树的最近公共祖先题目描述:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”题目思路:递归解析:终止条件:当越过叶节点,返回null当root等于p,q,返回root递推工作:递归左子节点,返回值为left递归右子节点,返回值为right返回值:当left和righ原创 2020-05-17 11:02:52 · 219 阅读 · 0 评论 -
二叉搜索树的最近公共祖先
二叉搜索树的最近公共祖先题目描述:给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”题目思路:若root是p,q的最近公共祖先,则只能是以下情况:p和q在root 的子树中,且为root的异侧。(即分别在左右子树中)。p=root,且q在root的左子树或者右子树中。q=root,且p在ro原创 2020-05-16 22:04:48 · 178 阅读 · 0 评论 -
和为S的连续正数序列
和为S的连续正数序列题目描述:输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。题目思路:定义一个左边界,一个右边界,左闭右开,形成一个滑动窗口。当窗口内的数值和小于目标值的时候,右边界向前滑动一位,左边界不动,扩大此窗口和。当窗口内的数值小于目标值的时候,左边界向前滑动一位,右边界不动,缩小此窗口和。当等于目标值的时候,记录此窗口内的数值。然后左边界向前滑动一位,继续判断。当左原创 2020-05-14 23:16:15 · 77 阅读 · 0 评论 -
层序从上到下打印二叉树
层序从上到下打印二叉树题目描述:从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。题目思路:如果根节点为空,那么返回一个空列表[]如果不为空,把根节点加入到队列中队列为空的时候跳出循环,否则进行下面的操作创建一个列表遍历队列里的元素,将其加入列表判断当前加入元素有无左右节点,如果有就加入题目代码:class solution{ ...原创 2020-04-27 14:15:10 · 89 阅读 · 0 评论 -
剑指offer---用两个栈实现队列
用两个栈实现队列题目描述:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )题目代码:class solution{ Stack<Integer> stack1; Stack<In...原创 2020-04-25 22:40:45 · 112 阅读 · 0 评论 -
剑指offer15---二进制中1的个数
#二进制中1的个数题目描述:请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。题目思路:当1&0,0&1,0&0都等于0只有1&1才为1所以我们可以循环判断输入整数与1相与的结果,如果结果为1,那么该数字的最右边一位肯定是1,否则为0....原创 2020-04-23 21:53:58 · 76 阅读 · 0 评论 -
二叉树最大深度
二叉树最大深度思路:题解://递归public class Offer55 { public int maxDepth(TreeNode root) { if(root == null) return 0; int leftDep = maxDepth(root.left); int rightDep = maxDepth(root...原创 2020-04-21 20:13:28 · 123 阅读 · 0 评论 -
剑指offer25---合并链表
合并链表题目描述输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4思路:遍历判断:创建一个伪头结点node,创建一个cur指向头结点。循环遍历结束条件为两个链表其中有一个为空。遍历l1,l2,将其数值小的节点接到c...原创 2020-04-20 09:20:41 · 74 阅读 · 0 评论 -
剑指offer---数组中数字出现的次数
数组中数字出现的次数题目:在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。思路:HashMap键值对<存放的数字,该数字出现的次数>题解:class Solution { public int singleNumber(int[] nums) { //hashmap K 存数字 V存次数...原创 2020-04-19 13:37:24 · 132 阅读 · 0 评论 -
剑指offer---左旋字符串
左旋字符串题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。示例 1:输入: s = “abcdefg”, k = 2输出: “cdefgab”示例 2:输入: s = “lrloseumgh”, k = 6输出: “umg...原创 2020-04-19 13:36:42 · 306 阅读 · 0 评论 -
剑指offer---反转链表
反转链表题目描述:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL思路:一、双指针迭代设置一个pre节点开始指向null,cur节点指向当前节点,反转整个链表就是用当前节点cur指向前驱节点pre。...原创 2020-04-19 10:34:29 · 86 阅读 · 0 评论 -
二叉树基本操作实现
package com.cskaoyan.bst;import sun.reflect.generics.tree.Tree;import javax.swing.text.AsyncBoxView;import java.util.ArrayList;import java.util.List;/*增: boolean add(E e)删: boolean r...原创 2020-04-01 18:38:21 · 107 阅读 · 0 评论 -
递归删除二叉搜索树
递归删除二叉搜索树思路:要删除的节点为叶子节点,可以直接删除。要删除的几点不是叶子节点且拥有右节点,则该节点可以由该节点的后继节点进行替代,该后继节点位于右子树中较低的位置。然后可以从后继节点的位置递归向下操作以删除后继节点。要删除的节点不是叶子节点,且没有右节点但是有左节点。这意味着它的后继节点在它的上面,但是我们并不想返回。我们可以使用它的前驱节点进行替代,然后再递归的...原创 2020-04-01 18:37:42 · 242 阅读 · 0 评论 -
LeetCode二叉搜索树的范围和
二叉搜索树的范围和题目:给定二叉搜索树的根结点 root,返回 L 和 R(含)之间的所有结点的值的和。二叉搜索树保证具有唯一的值。思路:我们对树进行深度优先搜索,对于当前节点 node,如果 node.val 小于等于 L,那么只需要继续搜索它的右子树;如果 node.val 大于等于 R,那么只需要继续搜索它的左子树;如果 node.val 在区间 (L, R) 中,则需要搜索它的所...原创 2020-04-01 18:36:58 · 204 阅读 · 0 评论 -
累加树
累加树/** * 给定一个二叉搜索树(Binary Search Tree), * 把它转换成为累加树(Greater Tree), * 使得每个节点的值是原来的节点值加上所有大于它的节点值之和。 */public class GreaterTree{ public class TreeNode { int val; TreeNod...原创 2020-03-30 22:05:06 · 2358 阅读 · 0 评论