Java
qq_37237304
这个作者很懒,什么都没留下…
展开
-
回溯算法 Java
主要思想: 按深度优先策略搜索问题,通过枚举的方式进行搜索,当发现搜索到的结果不满足问题的解时,就返回寻找别的路径。按照优选条件进行搜索,要实现回溯,首先要确定一个解空间。解空间是指形如数组的一个向量[a1,a2,a3,a4,a5…,an],这个元素。这个向量的每个元素都是问题的部分解,只有当这个数组的每一个元素都填满的时候,才表明这个问题得到了解答。 搜索则是for循环,通过n次循环得到结果。 代码演示: 回溯问题主要分为三种: 一,返回值是true或false boolean solve(Node N)原创 2021-09-27 15:35:16 · 282 阅读 · 0 评论 -
leetcode40组合总和 II
题目描述: 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 注意:解集不能包含重复的组合。 示例 1: 输入: candidates = [10,1,2,7,6,1,5], target = 8, 输出: [ [1,1,6], [1,2,5], [1,7], [2,6] ] 示例 2: 输入: candidates = [2,5,2,1,2], targe原创 2021-09-24 17:16:08 · 56 阅读 · 0 评论 -
Leetcode36 有效的数独
题目描述: 请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 数独部分空格内已填入了数字,空白格用 ‘.’ 表示。 注意:一个有效的数独(部分已被填充)不一定是可解的。 只需要根据以上规则,验证已经填入的数字是否有效即可。 示例 1: 输入:board = [[“5”,“3”,".",".",“7”,".原创 2021-09-21 13:39:50 · 62 阅读 · 0 评论 -
2021-09-03 leetcode34在排序数组中查找元素的第一个和最后一个位置
题目描述: 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 进阶: 你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗? 示例 1: 输入:nums = [5,7,7,8,8,10], target = 8 输出:[3,4] 示例 2: 输入:nums = [5,7,7,8,8,10], target = 6 输出:[-1,-1] 示例 3: 输入:nums =原创 2021-09-06 17:14:23 · 40 阅读 · 0 评论 -
leetcode33搜索旋转排序数组
题目描述: 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。 给你 旋转后 的数组 nums 和一原创 2021-09-03 16:46:26 · 45 阅读 · 0 评论 -
leetcode32最长有效括号
题目描述: 给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。 示例 1: 输入:s = “(()” 输出:2 解释:最长有效括号子串是 “()” 示例 2: 输入:s = “)()())” 输出:4 解释:最长有效括号子串是 “()()” 示例 3: 输入:s = “” 输出:0 解题思路: 方法一动态规划: 用dp[i]表示以下标i字符结尾的最长有效括号的长度,将dp数组全部初始化为0,有效的子串以“)“结尾,因此如果结尾是”(",则dp的值为0,只需要得到在‘原创 2021-09-03 11:11:27 · 43 阅读 · 0 评论 -
2021-08-30Java查找算法DFS
基本思想: DFS(深度优先搜索)是先序遍历的延续,其主要的思想是从顶点开始,递归遍历所有与顶点临接的点,当某个点被访问过就可以被标记为已被访问,DFS就是尽可能的当前遍历路径能够到达的最长路径,一旦到达终点,在进行回溯,从原来已经遍历过的顶点开始新的遍历。深度遍历需要使用栈(Stack),栈的特点是先进后出。首先将右结点压入栈,再将左结点压入栈。 代码实现: 二叉树访问 定义树节点 public class TreeNode { int val = 0; TreeNode left = n原创 2021-09-02 13:49:35 · 77 阅读 · 0 评论 -
leetcode 30串联所有单词的子串
题目描述: 给定一个字符串 s 和一些 长度相同 的单词 words 。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。 注意子串要与 words 中的单词完全匹配,中间不能有其他字符 ,但不需要考虑 words 中单词串联的顺序。 示例 1: 输入:s = “barfoothefoobarman”, words = [“foo”,“bar”] 输出:[0,9] 解释: 从索引 0 和 9 开始的子串分别是 “barfoo” 和 “foobar” 。 输出的顺序不重要, [9,0]原创 2021-08-27 14:24:17 · 150 阅读 · 0 评论 -
2021-08-27leetcode 29两数相除
题目描述: 给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。 返回被除数 dividend 除以除数 divisor 得到的商。 整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2 示例 1: 输入: dividend = 10, divisor = 3 输出: 3 解释: 10/3 = truncate(3.33333…) = trunca原创 2021-08-27 12:25:48 · 47 阅读 · 0 评论 -
leetcode28实现 strStr()
题目描述: 实现 strStr() 函数。 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。 说明: 当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。 示例 1: 输入:haystack = “原创 2021-08-26 17:55:24 · 70 阅读 · 0 评论 -
leetcode27移除元素
题目描述: 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 示例 1: 输入:nums = [3,2,2,3], val = 3 输出:2, nums = [2,2] 解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的原创 2021-08-26 17:42:16 · 56 阅读 · 0 评论 -
Java排序八堆排序
基本思想: 堆排序是一种树形选择排序方法,这种排序利用了堆的数据结构,是一种简单排序的改进版,将待排序的数组构造成一个大顶堆,将堆顶元素R1与最后一个元素R[n]交换,此时得到新的无序区和新的有序区,由于交换后的新的堆顶可能违反堆的性质,因此需要当前无序区调整为新堆,然后再将R1 与无序区的最后一个元素进行交换,得到新的无序区和新的有序区,重复此过程知道有序区的长度为初始数组的长度减一为止。 时间复杂度:O(nlogn),根据二叉树的特性得知 空间复杂度:O(1) 代码实现: public class he原创 2021-08-26 12:56:41 · 59 阅读 · 0 评论 -
2021-08-25Java排序七快速排序
基本思想: 从数组中挑出一个元素作为基准,将数组分为两个部分,比基准大的元素放在基准的后面,比基准小的元素放在基准的前面,此时基准位于数组的中间位置,然后再用递归对两边的数组进行相同的操作,最终完成排序。 时间复杂度:O(nlog) 空间复杂度:O(logn) 左右双指针,将数组的右边界right作为基准,从数组的左边界left开始找比right大的数,从数组的右边界right向前找比right小的数,找到后交换两个数的位置,知道left大于等于right时,终止排序,最后将left与最后一个位置的数做交换原创 2021-08-25 23:43:18 · 51 阅读 · 0 评论 -
java查找二分法查找(一)
基本思想:首先数组应是有序的,然后通过,每次都以序列中间的位置与目标数进行比较,每次比较之后就缩小一半的查找范围,如果中间位置的关键字与目标数一致,则查找成功。 时间复杂度: 空间复杂度:O(log^2n) 空间复杂度: 非递归O(1) 递归O(log^2n) 代码实现: public class Binarys { /** * 使用递归进行二分法查找 * @param num 数组 * @param key 目标值 * @param left 数组左边界原创 2021-08-25 17:29:28 · 69 阅读 · 0 评论 -
Java排序六归并排序
基本思想: 使用分治法对数据进行处理,首先将数组不断的对半分成字数组,直到不再可分时,然后将没个相邻的元素进行比较,最后利用递归将两个数组合后在进行比较,最终合并为一个有序的数组。 时间复杂度: O(nlogn) 空间复杂度:O(n) 代码实现: public class MerSor { /** * 将两个数组不断均分成长度更小的数组 * @param num * @return */ public int[] MergeSort(int[] num原创 2021-08-25 13:41:09 · 46 阅读 · 0 评论 -
Java排序五希尔排序
基本思想: 希尔排序属于直接插入排序的改进版,主要思想就是每一遍都与数组自身长度的一半进行比较,比如第一次遍历就是位置为1的元素与位置为1加数组长度一半的位置的元素进行比较,然后第二遍就是与数组长度一半的一半加1进行比较,知道比较的位置变为自己元素的下一个元素为止。 时间复杂度: 空间复杂度: 代码实现: public class ShellSort { public int[] Shell(int[] nums){ if (nums.length ==0 ) return nums原创 2021-08-25 12:05:54 · 46 阅读 · 0 评论 -
Java排序四插入排序
基本思想: 从第二个位置开始,与前面已经排序好的数组进行对比,找到合适的位置插入进去。 时间复杂度:O(n^2) 空间复杂度:O(1) 代码实现: public class InsertSort { public int[] insertionSort(int[] nums){ if (nums.length ==0) return nums; int current;//当前数组 for (int i = 0;i<nums.length;i++原创 2021-08-24 21:45:03 · 46 阅读 · 0 评论 -
Java排序三选择排序
算法思想: 一直寻找剩下的数组中的最小元素,每遍历一次,数组长度减一,将最小的数放入现有数组的首位,知道遍历完所有数组中的元素。当遍历数组时,首先比较前两个元素,找到值小的元素,用这个元素去和其他的元素进行比较,如果比其他的元素都小,那么这个元素就是最小的元素,如果有比这个元素更小的元素,则将他们的位置互换,重复以上操作。 时间复杂度:O(n^2) 空间复杂度:O(1) 代码实现 public class SelectSort { public int[] selecttionSort(int[]原创 2021-08-24 21:25:43 · 49 阅读 · 0 评论 -
Java排序二冒泡排序
算法思想: 比较两个相邻的元素,如果左边的值大于右边的值,那么两个元素进行位置互换,否则位置不变。 时间复杂度:O(n^2) 空间复杂度O(1) 代码实现: public class BubbleSort { public static int[] bubblesort(int[] nums) { //如果长度为零直接返回数组 if (nums.length == 0) return nums; for (int j = 0; j < nums.原创 2021-08-24 12:51:27 · 47 阅读 · 0 评论 -
2021-08-23 Java十大排序一
排序的定义:把一些乱的数据通过某种方法由小到大排列起来 排序种类: 非线性时间比较排序 交换排序 冒泡排序 快速排序 插入排序 直接插入排序 希尔排序 选择排序 简单选择排序 堆排序 归并排序 线性时间非比较排序 计数排序 桶排序 基数排序 时间复杂度比较 排序算法 平均时间复杂度 最好情况 最坏情况 冒泡排序 O(n^2) O(n) O(n^2) 选择排序 O(n^2) O(n^2) O(n^2) 插入排序 O(n^2) O(n) O(n^2)原创 2021-08-24 12:01:19 · 60 阅读 · 0 评论 -
java虚拟机四
Access access_flags是一种由标志所构成的掩码,用于表示某个类或接口的访问权限属性。 This(本类索引) this_class的值必须是对常量池表中某项的一个有效索引值常量池在这个索引处的成员必须为CONSTANT_Class_info类型结构体,该结构表示这个class文件所定义的类或接口。 Super(父类索引) 对于类来说,super_class的值要么是0,要么是对常量池中某项的一个有效索引值,如果他的值不是0,那么常量池在这个索引处的成员必须为CONSTANT_class_inf原创 2021-08-06 11:17:35 · 37 阅读 · 0 评论 -
JVMJava虚拟机二Class文件
Class 文件结构 定义 Java虚拟机只与特定的二进制文件格式class文件有关联 还有其他语言也能够编译出class文件 class文件包含了Java虚拟机的指令集,符号表以及若干辅助信息 与类的关系 每一个class文件都对应一个类或一个接口,但类和接口并不都定义在文件里 文件格式 每个class文件都由字节流组成,每个字节含有8个二进制位。 多字节数据项总是按照Big-endian(大端在前)的顺序进行存储。 Big-endian(大端在前):数据的低位保存在内存的高地址中,而数据的高位原创 2021-07-30 17:57:12 · 48 阅读 · 0 评论 -
JVMJava虚拟机一
虚拟机分为程序虚拟机和系统虚拟机 定义 JVM java虚拟机是Java运行的基础 JVM可以看作一个抽象的计算机 java虚拟机和java并无必然联系,它直接与特定的二进制文件格式class关联。 JVM有自己的指令集,有运行时的内存管理 规范 官方给出整个框架的的设定和约定 不同的JDK版本有不同的JVM规范 官方文档 产品 Classic VM HotSpot(Oracle 和 OpenJDK默认) JRockit J9(IBM) Google Android Dalvik VM KVM,C原创 2021-07-30 13:37:23 · 70 阅读 · 0 评论