自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(30)
  • 收藏
  • 关注

原创 计数质数——厄拉多塞筛法

1. 题目描述统计所有小于非负整数 n 的质数的数量。2. 思路(1)暴力解法(超出时间限制)从2开始遍历,对每个数字检测是否为质数,直到n。检测方法:如果从2开始到它本身(不包括本身)的范围,有一个数能被它整除,则说明这个数不是质数。(2)优化的暴力解法(超出时间限制)1)所有的偶数都不是质数,除了0,2,所以可以先筛选掉。2)对正整数 n ,如果用2到 √n 之间(注意要包含边界)的所有整数去除,均无法整除,则n为质数。对条件(2)进行处理时,对于除数,可以跳过所有的偶数部分,即从3开

2021-04-28 00:33:28 410

原创 在 D 天内送达包裹的能力——二分查找法

1. 题目描述传送带上的包裹必须在 D 天内从一个港口运送到另一个港口。传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。返回能在 D 天内将传送带上的所有包裹送达的船的最低运载能力。输入:weights = [1,2,3,4,5,6,7,8,9,10], D = 5输出:15解释:船舶最低载重 15 就能够在 5 天内送达所有包裹,如下所示:第 1 天:1, 2, 3, 4, 5第 2 天

2021-04-26 21:58:50 116

原创 剑指 Offer 38. 字符串的排列——回溯思想模板

1. 题目描述输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。2. 思路回溯算法的模板:private void backtrack("原始参数") { //终止条件(递归必须要有终止条件) if ("终止条件") { //一些逻辑操作(可有可无,视情况而定) return; } for (int i = "for循环开始的参数"; i < "for循环结束的参数";

2021-04-24 16:15:14 83

原创 剑指 Offer 66. 构建乘积数组

1. 题目描述给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。2. 思路先求出下三角的乘积,再求出上三角的乘积,再将两者对应下标相乘;计算上三角或下三角时可以利用到之前求出的值。3. 代码class Solution { public int[] constructArr(int[] a) {

2021-04-21 20:40:57 54

原创 剑指 Offer 64. 求1+2+…+n(逻辑运算符的短路效应)

1. 题目描述求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。2. 思路递归+逻辑运算符的短路效应。逻辑运算符的短路效应:A && B // 若 A 为 false ,则 B 的判断不会执行(即短路),直接判定 A && B 为 falseA || B // 若 A 为 true ,则 B 的判断不会执行(即短路),直接判定 A || B 为 true3. 代码cla

2021-04-21 17:30:43 57

原创 剑指 Offer 62. 圆圈中最后剩下的数字(约瑟夫环问题)

1. 题目描述0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。2. 思路(1)解法一:将数据存至数组中,计算每次需要移出的元素的索引,由于是圆形排列,所以需要通过取模的方式求下标;直到数组内只剩一个元素,返回结果。(2)解法二:递归分解思想我们

2021-04-21 15:30:51 59

原创 Java多线程详解

1.线程的状态创建,就绪,运行、阻塞和死亡状态。(1)新建状态(New):新创建了一个线程对象。(2)就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。(3)运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。(4)阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。(5)死亡状态(Dead):线程执

2021-04-19 22:49:34 58

原创 剑指 Offer 59 - II. 队列的最大值

1. 题目描述请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -12. 思路本题主要解决的是找出队列的最大值,所以可以通过维护一个辅助队列(通过双向队列实现),使队头到队尾为单调递减的,则辅助队列的队头就是所求的最大值。另外一个队列用于入队、出队操作。那怎么维护这样一个辅助队列呢?当我们进行入队时,需要从队尾弹

2021-04-19 21:30:26 66

原创 剑指 Offer 57 - II. 和为s的连续正数序列

1. 题目描述输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。示例 1:输入:target = 9输出:[[2,3,4],[4,5]]2. 思路滑动窗口机制:左、右指针只能向右移动,不能向左移动。(1)初始:左指针、右指针都指向0,它们的和sum=0;(2)如果它们的和小于目标值,则右指针向右移动,它们的和要加上新的右指针的值;(3)如果它们的和大于目标值,则左指针向右移动,它们的

2021-04-17 00:04:35 55

原创 581. 最短无序连续子数组

1. 题目描述给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。(根据这个判断最短)请你找出符合题意的 最短 子数组,并输出它的长度。2. 思路(1)将原来的数组进行排序,用新的数组保存起来;(2)从左边开始,比较两个数组对应位置的值是否相等,找到第一个不相等的索引,为左指针;(3)从右边开始,比较两个数组对应位置的值是否相等,找到第一个不相等的索引,为右指针;(4)如果是右指针-左指针大于0,则说明该数组是无序的,返回右指

2021-04-16 14:35:12 69

原创 剑指 Offer 52. 两个链表的第一个公共节点

1. 题目描述输入两个链表,找出它们的第一个公共节点。2. 思路(1)比较两个链表的长度,让长的先走,直到两个链表的长度相等;(2)两个链表同时一起走,比较两个链表是否相等。如果相等,则返回结点。否则当遍历完时,返回null。3. 代码public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { if(headA==null || headB==null

2021-04-13 15:46:03 45

原创 LeetCode 5 最长回文子串

1. 题目描述给你一个字符串 s,找到 s 中最长的回文子串。2. 思路(1)定义状态:dp[i][j] 表示s[i…j] 是否是回文串(2)得到状态转移方程:dp(i,j)=dp(i+1,j−1)∧s(i)==s(j),即从外向里收缩;(3)初始化状态:长度为1的字符串为true。3. 代码class Solution { public String longestPalindrome(String s) { int len = s.length(); if

2021-04-13 00:06:48 49

原创 LeetCode 3.无重复字符的最长子串——滑动窗口

1. 题目描述给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。2. 思路(1)从左开始遍历,固定左指针,右指针向右开始遍历;(2)如果没遇到重复元素,则一直向右遍历 ,用HashSet存储元素;(3)当遇到重复元素时,则停止遍历,求出当前的最长子串长度,若比原来的最大值大,则替换;(4)左指针向右移动,同时移除HashSet的最左边一个元素,即向右滑动一格,右指针继续在原来的索引向右遍历;(5)直到左指针滑动最后一个元素,返回结果。3. 代码class Solution {

2021-04-11 21:02:17 109

原创 Java面试题(一)

1. 面向对象跟面向过程进行对比。面向过程注重过程,即注重每一个步骤和顺序。面向对象更注重有哪些对象(参与者),这些对象做了什么。面向过程比较直接高效。面向对象易于扩展、复用和维护。面向对象的三大特性:封装、继承和多态。(1)封装隐藏对象的属性和方法,只对外提供调用方式。外部调用者不需要知道内部的实现细节,只需要关注如何去调用。比如我们调用一个方法,我们不需要知道它实现的细节,只需要知道如何调用就好。(2)继承子类继承父类,子类共性的方法或属性可以直接使用父类的,子类只需要扩展个性化的。

2021-04-11 18:22:24 74

原创 LeetCode 72. 编辑距离

1. 题目描述给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符2. 思路(1)初始化状态,设dp[i][j]为word1的第i个字符(str[i]),word2(str2[j])的第j个字符的最少操作数;(2)确定转移方程:当str[i] = str[j]时,dp[i][j] = dp[i-1][j-1];当str[i] != str[j]时,dp[i][j

2021-04-11 15:17:06 53

原创 剑指 Offer 60. n个骰子的点数

1. 题目描述n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。2. 思路(1)设dp[i][j]为第i枚骰子,点数j出现的次数,则最后需要求的结果为所有点数各自出现的次数除以总的次数(6^n);(2)转移方程为原来的点数加上第i次出现的点数之和。(3)初始化次数为1的情况。(4)求出概率。3. 代码class Solution { p

2021-04-10 22:36:04 74

原创 剑指 Offer 46. 把数字翻译成字符串

1. 题目描述给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。2. 思路求滚动数组问题:动态规划(1)设dp[i]为前i个数字有多少种不同的翻译方法,则要求得结果为dp[n];(2)动态转移方程为:当第i个数x(i)和第i-1个数x(i-1)可以合并,即10<=x(i-1)x(i)<=25时,dp[i]

2021-04-10 15:08:05 44

原创 剑指 Offer 34. 二叉树中和为某一值的路径

1. 题目描述输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。2. 思路(1)先序遍历路径,并将遍历的结点加入路径;(2) 如果遍历到根节点时,路径的和等于目标值,则将路径路径加入结果,否则则需要回溯到上一个结点,移出路径的最后一个节点的值。(3)先序遍历完所有路径,返回结果。3. 代码class Solution { List<List<Integer>> res = n

2021-04-09 23:58:43 57

原创 剑指 Offer 45. 把数组排成最小的数

1. 题目描述输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。2. 思路利用排序思想解决问题。(1)因为结果可能非常大,所以先将整型数组准转化为字符串数组处理。(2)设任意两个字符串数组的左、右元素分别为x、y。(本次算法采用快速排序方法排序)如果(x+y)<(y+x),则说明是有序的,位置不变;如果(x+y)>=(y+x),则说明x,y是倒序的,需要颠倒位置。(3)直到整个字符串数组有序,将整个字符串数组转化为字符串,返回结果。3

2021-04-09 13:16:41 56

原创 剑指 Offer 33. 二叉搜索树的后序遍历序列

1. 题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。2. 思路(1)由后序遍历性质可知根节点为最右边结点;(2)找到根节点后,从左开始找到第一个大于根节点的索引,则该索引之后的节点为右子树(不包括根节点),左边的为左子树;(3)遍历根节点的右子树,如果右子树有大于根节点的,则该数组不是后序遍历的结果;(4)当树的左边界大于等于右边界时,说明该数组(left至right)满足条件,结束递归

2021-04-05 18:28:21 50

原创 剑指 Offer 26. 树的子结构

1. 题目描述输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)2. 思路(1)先序遍历树A找到第一个与树B相等的值,如果没找到,则直接返回false;(2)找到之后深入查找比较B是否为A的子结构,查找比较正确后就可以返回true,不需要继续遍历。(3)如果不正确则继续步骤(1)和(2)。3. 代码class Solution { boolean result = false; //判断树B是否为A的子结构 public boolean i

2021-04-05 14:26:20 42

原创 剑指 Offer 20. 表示数值的字符串

1. 题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、"-1E-16"、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、"±5"及"12e+5.4"都不是。2. 思路(1)跳过前面的空格部分,开始遍历;(2)判断是否包含整数部分;(3)判断是否包含小数部分,如果有小数,小数两边只要有一边为数字即可;(4)判断是否包含指数部分,如果有指数,指数两边必须为都为数字,且指数右边可以为负数;

2021-04-05 00:25:48 44

原创 案例讲解DFS

1. 算法原理深度优先搜索(DFS):从某个起点出发,依次遍历每个未访问的邻接点,对每一个可能的分支路径深入到不能再深入为止。如下图:2. 案例1——机器人的运动范围(1)题目描述地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能

2021-04-03 23:15:26 175

原创 根据前序遍历和中序遍历结果重建二叉树——递归法

1. 题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。2. 思路前序遍历的形式:根节点, [左子树的前序遍历结果], [右子树的前序遍历结果]中序遍历的形式:[左子树的中序遍历结果], 根节点, [右子树的中序遍历结果](1)由前序遍历可以得到根节点,根据根节点索引和中序遍历结果,我们就可以分别知道左子树和右子树中的节点数目。可以通过哈希索引标记中序遍历结果。(2)根据前序遍历的结果,对上述形式中的所有左右括号进行

2021-03-31 17:18:59 451

原创 动态规划 ——剪绳子(Java)

1. 题目描述给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。2. 动态规划解决问题(1)定义数组含义dp[i]表示子绳子的最大乘积,即所求最大乘积为dp[n](2)确认数组间的关系式剪下一刀后剩下的两段长度是j和i-j,在这个

2021-03-29 23:55:34 521

原创 Java小白的学习笔记(1)

JDK和JRE跨平台A: JDK与JRE的关系a: JRE:Java Runtime Environment它是Java运行环境,如果你不需要开发只需要运行Java程序,那么你可以安装JRE。它包含了Java虚拟机,也就是JVM,b: JDK:它是Java开发运行环境,提供了Java语言的开发工具.JDK包含了JRE,同时也就包含JVM。B: 跨平台特性a: 平台指的是操作系统 (Windows,Linux,Mac)。b: Java程序可以在任意操作系统上运行,一次编写到处运行c: 实现跨..

2020-08-13 16:02:43 168

原创 排序算法(3)——选择排序(包含简单选择和堆排序)

选择排序

2020-08-13 13:44:53 174

原创 排序算法(4)——归并排序(2路归并排序)

归并排序归并:将两个或两个以上的有序表组合成一个新有序表。排序过程:初始序列看成n个有序子序列,每个子序列长度为1;两两合并,得到n/2个长度为2或1的有序子序列;再两两合并,重复直至得到一个长度为n的有序序列为止。例子代码实现:代码可结合上面例子进行理解。#include<iostream>using namespace std;//共同部分——将两个有序序列合并为一个有序序列void Merge(int list[], int low, int m, int

2020-08-12 15:17:30 479

原创 排序算法(2)——交换排序(包含冒泡和快速排序)

排序算法(2)——交换排序基本思想:两两比较,如果发生逆序则交换,直到所有记录都排好序为止。1. 冒泡排序法基本思想每趟不断将相邻的两个元素进行比较,逆序的交换元素,每趟结束后,最大的元素排序到位。例子代码实现void bubbleSort(vector &list){ for (int i = 1; i < list.size() ;i++) { for (int j = 0; j < n - i; j++) { if (li

2020-08-09 22:28:15 136

原创 排序算法(1)——插入排序(包含直接插入,折半插入以及希尔排序)

排序算法一、插入排序基本思想:每步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入为止。即边插边排序,保证子序列中随时都是排好序的。直接插入排序排序过程:整个排序过程为n-1趟插入,即先将序列中第1个记录看成是一个有序子序列,然后从第2个记录开始,逐个进行插入,直至整个序列有序。例(13,6,3,31,9,27,5,11)【13】, 6, 3, 31, 9, 27, 5, 11【6, 13】, 3, 31, 9, 27, 5, 11【3,

2020-08-08 22:45:22 283

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除