![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
查找与排序
甘甘甘甘甘甘甘
码不停题
展开
-
题解|在有空字符串的有序字符串数组中查找
在有空字符串的有序字符串数组中查找 在有空字符串的有序字符串数组中查找某一字符串 给定条件,在字符串数组{“a”,"",“ac”,"",“ad”,“b”,"",“ba”}中查找b的索引 思路 因为字符串数组是有序的,所以尝试采用二分查找。 在二分查找过程中,中值有可能是空字符串,所以要对这原创 2019-01-15 11:55:10 · 482 阅读 · 0 评论 -
题解|需要排序的子数组长度(锯齿形数组)
需要排序的子数组 题目描述 给定一个无序数组arr,求出需要排序的最短子数组长度 如输入:arr = {2,3,7,5,4,6},返回4,因为只有{7,5,4,6}需要排序 思路 确定数组最大值位置,从该位置向右扫描寻找是否有小于最大值的元素,若有则扩大需要排序区间的右端。 确定数组最小值位置,从该位置向左扫描寻找是否有大于最小值的元素,若有则扩大需要排序区间的左端。 得出左右端点即可计算长度 ...原创 2019-01-29 15:48:06 · 653 阅读 · 3 评论 -
题解|排序数组中寻找和的因子
排序数组中寻找和的因子 题目描述 给定已排序数组arr和k,不重复打印arr中所有相加和为k的不降序二元组 如输入arr={-8,-4,-3,0,2,4,5,8,9,10};k=10; 输出(0,10)(2,8) 思路1:遍历数组每个元素,用二分查找寻找k-arr[i] 思路2:双指针逼近法 下面提供思路2的源代码 public class 排序数组中找和的因子_02 { public s...原创 2019-01-29 14:51:40 · 365 阅读 · 0 评论 -
基数排序
基数排序 import java.util.ArrayList; /* * 桶排序的变种 * 下列的桶排序不包含排序负数的功能 * 根据数组中最大数字的位数K进行K次的入桶和分配操作 */ public class RadixSort { public static void main(String[] args) { // TODO Auto-generated method ...原创 2019-01-26 16:03:30 · 151 阅读 · 0 评论 -
计数排序
计数排序 思路 元素转下标 下标转元素 下面的源代码不包含对非负数排序的功能 /* * 非常快,但是有可能浪费大量空间 */ public class 计数排序 { public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = { 0, 16, 4, 10, 14,...原创 2019-01-25 20:20:32 · 108 阅读 · 0 评论 -
堆排序|以小顶堆实现升序排序
以小顶堆实现升序排序 思路 堆化 创建辅助空间,并将原数组拷贝给辅助空间 在辅助空间上,将根节点元素与数组最后一个元素位置交换,在原数组上记录此时的最后一个元素。 在辅助空间上调整数组,但规模(n)减1。 如此循环直到n=3 // 升序堆排序 public static void minHeapUpSort(int[] arr, int i, int n) { makeMinHeap(a...原创 2019-01-25 19:40:24 · 600 阅读 · 0 评论 -
堆排序|minHeapFixDown的递归和迭代形式
minHeapFixDown的递归和迭代形式 // 把以i为根节点的二叉堆调整成小顶堆 public static void minHeapFixDown(int[] arr, int i, int n) { // 找到左右孩子 int left = 2 * i + 1; int right = 2 * i + 1; // 找到左右孩子中的最小孩子 // 左孩子越界,右孩子必...原创 2019-01-25 00:14:44 · 680 阅读 · 0 评论 -
一题三解|最小可用ID
最小可用ID 描述 在非负数组(乱序)中找到最小的可分配的id(从1开始编号),数据量1000000。 例如(3,2,1,5,8,6)中,最小可用ID为4。 解法1 将乱序数组排序之后,对数组中的数字进行位置确认。即第x个数字要在x - 1的索引上。复杂度O(nlgn) private static int f(int[] arr) { Arrays.sort(arr); int res ...原创 2019-01-22 14:59:37 · 476 阅读 · 1 评论 -
题解|超过数组长度一半的数字
超过数组长度一半的数字 描述 数组中有一个数字的出现次数超过了该数组长度的一半,找出这个数字。 思路 排序后返回arr[arr.length/2]。 排序后扫描。 超过数组长度一半的数字,其次数累加和一定大于其余数字的累加和。所以可以直接遍历数组,保存当前数字和出现次数,相同数字count++否则count- -,若count = 0则重置当前数字和出现次数。遍历完成后,返回保存的数字。 pu...原创 2019-01-22 11:29:43 · 208 阅读 · 0 评论 -
归并排序|递归与非递归形式
归并排序 取中间值,将数组分为左右两部分。 对左右两部分,分别进行排序。 借助辅助数组,合并两部分。 public class MegerSort { public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = { 11, 2, 5, 8, 7, 6, 3, 9 };...原创 2019-01-21 20:37:17 · 131 阅读 · 0 评论 -
题解|奇数在左偶数在右之快排的双指针思想
奇数在左偶数在右 思路:快排的双指针思想 public class 奇数在左偶数在右 { public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = { 2, 3, 6, 8, 1, 12, 10, 7, 5, 4, 9 }; f(arr); for (int n...原创 2019-01-20 15:13:09 · 281 阅读 · 0 评论 -
题解|高效率求出乱序数组中的第k小元素
高效率求出乱序数组中的第k小元素 public class 最快效率求出乱序数组中的第k小元素 { public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = { 9, 8, 4, 3215, 1, 54, 9, 3 }; System.out.println(f(a...原创 2019-01-20 15:09:26 · 335 阅读 · 0 评论 -
一题三解|TwoSum
TwoSum 描述 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。你需要输出这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 0 到 n-1。 你可以假设数组递增有序。 输入 第一行:N个整数,作为数组的元素,空格分开 第二行:target 输出 两个下标,空格隔开。如有多组满足要求,输出靠前的一组。 样例输入 4 2 7 11 15 9 样例输出 0...原创 2019-01-19 20:04:02 · 205 阅读 · 0 评论 -
题解|旋转数组中的二分查找
题解|旋转数组中的二分查找 描述 输入一个递增排序的数组(元素不重复)的一个旋转(次数不详),找出某个元素. 输入 第一行:N,数组的长度 第二行:N个整数,作为数组的元素,空格分开 第三行:要查找的关键字K 输出 关键字K的下标,如果没有找到,输出-1 样例输入 5 6 1 2 3 4 1 样例输出 1 思路 O(n)的算法不写了,下面是O(lgn)的。 在旋转数组中先找到最小的一个元素位置...原创 2019-01-19 17:25:58 · 542 阅读 · 0 评论 -
快排之双向扫描分区
快排之双向扫描分区 public class 快排之双向扫描分区 { public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = { 9, 8, 7, 6, 5, 0, 4, 8, 3, 2, 8, 7, 10 }; quickSort(arr, 0, arr.len...原创 2019-01-18 12:18:57 · 336 阅读 · 2 评论 -
快排之三指针扫描分区
快排之三指针扫描分区 适用于选取主元时,所选主元在数组中有多个相同值。若数组中没有主元的相同值,没有必要用三指针扫描分区法。 下面主要分析的是partition部分的方法: 三个指针:less(指向第一个等于主元的位置);sc(向右移动的扫描指针,指针左侧皆小于等于主元);bigger(指针右侧皆大于主元) 在分区时有三个阶段: 阶段1: sp指针一直向右移,当扫描到小于主元的值时sc++,当...原创 2019-01-18 12:10:18 · 894 阅读 · 4 评论 -
快排之单向扫描分区法
快排之单向扫描分区法 public class 快排之单向扫描分区 { public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = { 9, 8, 7, 6, 5, 0, 4, 8, 3, 2, 8, 7, 10 }; quickSort(arr, 0, arr.le...原创 2019-01-17 19:19:07 · 748 阅读 · 4 评论 -
题解|最长连续递增子序列
最长连续递增子序列 给定一个未经排序的整数数组,找到最长且连续的的递增序列。 示例 1: 输入: [1,3,5,4,7] 输出: 3 解释: 最长连续递增序列是 [1,3,5], 长度为3。 尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为5和7在原数组里被4隔开。 示例 2: 输入: [2,2,2,2,2] 输出: 1 解释: 最长连续递增序列是 [2], 长度为1。...原创 2019-01-15 18:47:46 · 1146 阅读 · 0 评论 -
特殊排序|自定义比较规则
特殊排序 题目描述 设计一个函数打印出整型数组全部数字的最小组合数。 例如数组{3,32,321},打印这3个数字的最小组合数,321323 基于冒泡排序的自定义比较规则源代码 import java.util.Scanner; public class 特殊排序 { /* * 输入数组{3,32,321},打印这3个数字的最小组合数,321323 */ public static ...原创 2019-01-30 22:37:54 · 233 阅读 · 0 评论