算法练习-排序(二)
算法练习-排序(二)
文章目录
- 算法练习-排序(二)
- 1 合并排序的数组
- 1.1 题目
- 1.2 题解
- 2 有效的字母异位词
- 2.1 题目
- 2.2 题解
- 3 判断能否形成等差数列
- 3.1 题目
- 3.2 题解
- 4 合并区间
- 4.1 题目
- 3.2 题解
- 5 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
- 5.1 题目
- 5.2 题解
- 6 颜色分类
- 6.1 题目
- 6.2 题解
- 7 最小k个数
- 7.1 题目
- 7.2 题解
- 8 排序链表
- 8.1 题目
- 8.2 题解
- 8.2.1 递归解法
- 8.2.2 非递归解法
- 9 剑指 Offer 51. 数组中的逆序对(hard)
- 9.1 题目
- 9.2 题解
- 9.2.1 暴力(超时)
- 9.2.2 逆序度
1 合并排序的数组
链接:https://leetcode.cn/problems/sorted-merge-lcci
1.1 题目
给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。
初始化 A 和 B 的元素数量分别为 m 和 n。
示例:
输入:
A = [1,2,3,0,0,0], m = 3
B = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
说明:
A.length == n + m
1.2 题解
class Solution {public void merge(int[] A, int m, int[] B, int n) {int k = m + n - 1;int i = m - 1;int j = n - 1;while (i >= 0 && j >= 0) {if (A[i] >= B[j]) {A[k--] = A[i];i--;} else {A[k--] = B[j];j--;}}while (i >= 0) {A[k--] = A[i--];}while (j >= 0) {A[k--] = B[j--];}}
}
2 有效的字母异位词
链接:https://leetcode.cn/problems/valid-anagram
2.1 题目
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例 1:
输入: s = “anagram”, t = “nagaram”
输出: true
示例 2:
输入: s = “rat”, t = “car”
输出: false
提示:
1 <= s.length, t.length <= 5 * 104
s 和 t 仅包含小写字母
2.2 题解
class Solution {public boolean isAnagram(String s, String t) {if (s.length() != t.length()) {return false;}char[] str1 = s.toCharArray();char[] str2 = t.toCharArray();Arrays.sort(str1);Arrays.sort(str2);for (int i = 0; i < str1.length; i++) {if (str1[i] != str2[i]) {return false;}}return true;}
}
3 判断能否形成等差数列
链接:https://leetcode.cn/problems/can-make-arithmetic-progression-from-sequence
3.1 题目
给你一个数字数组 arr 。
如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 。
如果可以重新排列数组形成等差数列,请返回 true ;否则,返回 false 。
示例 1:
输入:arr = [3,5,1]
输出:true
解释:对数组重新排序得到 [1,3,5] 或者 [5,3,1] ,任意相邻两项的差分别为 2 或 -2 ,可以形成等差数列。
示例 2:
输入:arr = [1,2,4]
输出:false
解释:无法通过重新排序得到等差数列。
提示:
2 <= arr.length <= 1000
-10^6 <= arr[i] <= 10^6
3.2 题解
class Solution {public boolean canMakeArithmeticProgression(int[] arr) {Arrays.sort(arr);int diff = arr[1] - arr[0];for (int i = 2; i < arr.length; i++) {if (arr[i] - arr[i - 1] != diff) {return false;}}return true;}
}
4 合并区间
链接:https://leetcode.cn/problems/merge-intervals
4.1 题目
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
3.2 题解
class Solution {public int[][] merge(int[][] intervals) {Arrays.sort(intervals, new Comparator<int[]>() {public int compare(int[] interval1, int[] interval2) {return interval1[0] - interval2[0];}});List<int[]> result = new ArrayList<>();int curLeft = intervals[0][0];int curRight = intervals[0][1];for (int i = 1; i < intervals.length; ++i) {if (intervals[i][0] <= curRight) {if (intervals[i][1] > curRight) {curRight = intervals[i][1];}} else {result.add(new int[]{curLeft, curRight});curLeft = intervals[i][0];curRight = intervals[i][1];}}result.add(new int[]{curLeft, curRight});return result.toArray(new int[result.size()][]);}
}
5 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
链接:https://leetcode.cn/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof
5.1 题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。
示例:
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
提示:
0 <= nums.length <= 50000
0 <= nums[i] <= 10000
5.2 题解
class Solution {public int[] exchange(int[] nums) {int i = 0;int j = nums.length - 1;while (i < j) {if (nums[i] % 2 == 1) {i++;continue;}if (nums[j] % 2 == 0) {j--;continue;}int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;i++;j--;}return nums;}
}
6 颜色分类
链接:https://leetcode.cn/problems/sort-colors
6.1 题目
给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
必须在不使用库内置的 sort 函数的情况下解决这个问题。
示例 1:
输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]
示例 2:
输入:nums = [2,0,1]
输出:[0,1,2]
提示:
n == nums.length
1 <= n <= 300
nums[i] 为 0、1 或 2
6.2 题解
class Solution {public void sortColors(int[] nums) {int p = 0;int q = nums.length - 1;while (p < q) {if (nums[p] != 2) {p++;continue;}if (nums[q] == 2) {q--;continue;}swap(nums, p, q);p++;q--;}int i = 0;int j = p;if (nums[j] == 2) j--;while (i < j) {if (nums[i] == 0) {i++;continue;}if (nums[j] == 1) {j-;continue;}swap(nums, i, j);i++;j--;}}private void swap(int[] nums, int i, int j) {int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}
}
7 最小k个数
链接:https://leetcode.cn/problems/smallest-k-lcci
7.1 题目
设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。
示例:
输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]
提示:
0 <= len(arr) <= 100000
0 <= k <= min(100000, len(arr))
7.2 题解
class Solution {int[] result;int count = 0;public int[] smallestK(int[] arr, int k) {if (k == 0 || arr.length < k) return new int[0];result = new int[k];quickSort(arr, 0 , arr.length - 1, k);return result;}private void quickSort(int[] nums, int p, int r, int k) {if (p > r) return;int q = partition(nums, p, r);if (q - p + 1 == k) {for (int i = p; i <= q; ++i) {result[count++] = nums[i];}} else if (q - p + 1 < k) {for (int i = p; i <= q; ++i) {result[count++] = nums[i];}quickSort(nums, q + 1, r, k - (q - p + 1));} else {quickSort(nums, p, q - 1, k);}}private int partition(int[] nums, int p, int r) {int i = p - 1;int j = p;while (j < r) {if (nums[j] < nums[r]) {swap(nums, j, i + 1);i++;}j++;}swap(nums, i + 1, r);return i + 1;}private void swap(int[] nums, int i, int j) {int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}}
8 排序链表
8.1 题目
给你链表的头结点 head
,请将其按 升序 排列并返回 排序后的链表 。
**进阶:**你可以在 O(n log n)
时间复杂度和常数级空间复杂度下,对链表进行排序吗?
8.2 题解
8.2.1 递归解法
class Solution {public ListNode sortList(ListNode head) {if (head == null) return null;if (head.next == null) return head;ListNode midNode = findMidNode(head);ListNode nextNode = midNode.next;midNode.next = null;ListNode leftNode = sortList(head);ListNode rightNode = sortList(nextNode);return mergeList(leftNode, rightNode);}private ListNode findMidNode(ListNode head) {ListNode slow = head;ListNode fast = head;while (fast.next != null && fast.next.next != null) {fast = fast.next.next;slow = slow.next;}return slow;}private ListNode mergeList(ListNode headA, ListNode headB) {ListNode newHead = new ListNode();ListNode tail = newHead;ListNode pa = headA;ListNode pb = headB;while (pa != null && pb != null) {if (pa.val <= pb.val) {tail.next = pa;tail = tail.next;pa = pa.next;} else {tail.next = pb;tail = tail.next;pb = pb.next;}}if (pa != null) tail.next = pa;if (pb != null) tail.next = pb;return newHead.next;}
}
8.2.2 非递归解法
class Solution {
public ListNode sortList(ListNode head) { int n = len(head);int step = 1;while (step < n) {ListNode newHead = new ListNode(); // 结果链表ListNode tail = newHead;ListNode p = head;while (p != null) {// [p, q]ListNode q = p;int count = 1;while (q != null && count < step) {q = q.next;count++;}if (q == null || q.next == null) {//这⼀轮合并结束了tail.next = p;break;}//[q+1, r]ListNode r = q.next;count = 1;while (r != null && count < step) {r = r.next;count++;}// 保存下⼀个step的起点ListNode tmp = null;if (r != null) {tmp = r.next;}// merge[p, q][q+1, r]ListNode[] headAndTail = merge(p, q, r);tail.next = headAndTail[0];tail = headAndTail[1];p = tmp;}head = newHead.next;step *= 2;}return head;}private int len(ListNode head) {if (head == null) return 0;int n = 1;ListNode p = head;while (p != null) {n++;p = p.next;}return n;}private ListNode[] merge(ListNode p, ListNode q, ListNode r) {ListNode newHead = new ListNode();ListNode tail = newHead;ListNode pa = p;ListNode pb = q.next;q.next = null;if (r != null) {r.next = null;}while (pa != null && pb != null) {if (pa.val <= pb.val) {tail.next = pa;tail = tail.next;pa = pa.next;} else {tail.next = pb;tail = tail.next;pb = pb.next;}}if (pa != null) {tail.next = pa;tail = q;}if (pb != null) {tail.next = pb;tail = r;}return new ListNode[]{newHead.next, tail};}
}
9 剑指 Offer 51. 数组中的逆序对(hard)
链接:https://leetcode.cn/problems/shu-zu-zhong-de-ni-xu-dui-lcof
9.1 题目
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4]
输出: 5
限制:
0 <= 数组长度 <= 50000
9.2 题解
9.2.1 暴力(超时)
class Solution {public int reversePairs(int[] nums) {int count = 0;for (int i = 0; i < nums.length; i++) {int value = nums[i];for (int j = i + 1; j < nums.length; j++) {if (value > nums[j]) {count++;}}}return count;}
}
9.2.2 逆序度
逆序对个数=逆序度,排序的过程是不断减小逆序度的过程,在排序过程中,记录每步操作逆序度降低的个数,累加起来就能得到原始数据的逆序度
class Solution {int reverseCount = 0;public int reversePairs(int[] nums) {mergeSort(nums, 0, nums.length - 1);return reverseCount;}private void mergeSort(int[] nums, int p, int r) {if (p >= r) return;int q = (p + r) / 2;mergeSort(nums, p, q);mergeSort(nums, q + 1, r);merge(nums, p, q, r);}private int merge(int[] nums, int p, int q, int r) {int[] tmp = new int[r - p + 1];int i = p;int j = q + 1;int k = 0;while (i <= q && j <= r) {if (nums[j] < nums[i]) {reverseCount += (q - i + 1);tmp[k++] = nums[j];j++;} else {tmp[k++] = nums[i];i++;}}while (j <= r) {tmp[k++] = nums[j];j++;}while (i <= q) {tmp[k++] = nums[i];i++;}for (i = 0; i < r - p + 1; ++i) {nums[i + p] = tmp[i];}return reverseCount;}
}
相关文章:
算法练习-排序(二)
算法练习-排序(二) 文章目录算法练习-排序(二)1 合并排序的数组1.1 题目1.2 题解2 有效的字母异位词2.1 题目2.2 题解3 判断能否形成等差数列3.1 题目3.2 题解4 合并区间4.1 题目3.2 题解5 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面5.1 题目5.2 题解6 颜色分类6.1 题目6.…...

202302读书笔记|《长安的荔枝》——只要肯努力,办法总比困难多
202302读书笔记|《长安的荔枝》——只要肯努力,办法总比困难多 《长安的荔枝》这本书真是酣畅淋漓啊,读起来一气呵成,以讲故事的口吻叙述,上林署九品小官员——李善德,兢兢业业工作多年,终于借贷买了房&…...

java封装继承多态详解
1.封装 所谓封装,就是将客观事物封装成抽象的类,并且类可以把数据和方法让可信的类或者对象进行操作,对不可信的类或者对象进行隐藏。类就是封装数据和操作这些数据代码的逻辑实体。在一个类的内部,某些属性和方法是私有的&#…...

【uni-app教程】UniAPP 常用组件和 常用 API 简介# 知心姐姐聊天案例
五、UniAPP 常用组件简介 uni-app 为开发者提供了一系列基础组件,类似 HTML 里的基础标签元素,但 uni-app 的组件与 HTML 不同,而是与小程序相同,更适合手机端使用。 虽然不推荐使用 HTML 标签,但实际上如果开发者写了…...

阿尔法开发板 .bin 文件烧写
一. IMX6ULL 开发板简介 IMX6ULL 开发板是正点原子提供的阿尔法开发板,所用芯片为恩智浦,基于 Cortex-A7 架构。 这里介绍一下裸机篇中,关于如何将 .bin 文件烧写进 SD 卡,从而设备运行程序。 二. xx.bin 文件烧写 IMX6ULL支…...

Ceres-Solver 安装与卸载ubuntu20.04
卸载 sudo rm -rf /usr/local/lib/cmake/Ceres /usr/local/include/ceres /usr/local/lib/libceres.a 安装 sudo apt-get install libatlas-base-dev libsuitesparse-dev git clone https://github.com/ceres-solver/ceres-solver cd ceres-solver git checkout $(git descr…...

汇编系列02-借助操作系统输出Hello World
说明:本节的程序使用的是x86_64指令集的。 汇编语言是可以编译成机器指令的,机器指令是可以直接在CPU上面执行的。我们编写的汇编程序既可以直接在操作系统的帮助下执行,也可以绕过操作系统,直接在硬件上执行。 如果你打算编写的汇编程序在…...

【2023unity游戏制作-mango的冒险】-前六章API,细节,BUG总结小结
👨💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 收录于专栏:unity游戏制作 ⭐mango的冒险前六章总结⭐ 文章目录⭐mango的冒险前六章总结⭐👨&a…...
进程控制及其操作
进程创建1.1 fork()函数1.2 fork()函数的返回值进程等待2.1 进程等待的必要性1.之前讲过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。 2.另外,进程一旦变成僵尸状态,那…...

Git常用命令复习笔记
1. Git与SVN区别,各自优缺点 Git: 分布式,每个参与开发的人的电脑上都有一个完整的仓库,不担心硬盘出问题;在不联网的情况下,照样可以提交到本地仓库,可以查看以往的所有log,等到有…...

代码随想录算法训练营day49 | 动态规划 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV
day49123.买卖股票的最佳时机III1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组188.买卖股票的最佳时机IV1.确定dp数组以及下标的含义2.确定递推公式4.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组123.买卖股票的最佳时机III …...

【教学典型案例】14.课程推送页面整理-增加定时功能
目录一:背景介绍1、代码可读性差,结构混乱2、逻辑边界不清晰,封装意识缺乏3、展示效果不美观二:案例问题分析以及解决过程1、代码可读性…...
【算法基础】DFS BFS 进阶训练
DFS与BFS的基础篇详见:https://blog.csdn.net/m0_51339444/article/details/129301451?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22129301451%22%2C%22source%22%3A%22m0_51339444%22%7D 一、案例分析1 (树的重心 —— D…...
GO语言中的回调函数
0.前言 回调函数是一种在编程中常见的技术,通常在异步编程中使用。简单来说,回调函数是一个被传递给另一个函数的函数,它在该函数的某个时间点被调用,以完成某些特定的操作或任务。 在Go语言中,可以将函数直接作为参…...

28个案例问题分析---014课程推送页面逻辑整理--vue
一:背景介绍 项目开发过程中,前端出现以下几类问题: 代码结构混乱代码逻辑不清晰页面细节问题 二:问题分析 代码结构混乱问题 <template><top/><div style"position: absolute;top: 10px"><C…...
佛科院单片机原理2——80C51单片机结构
一、程序存储器的入口地址:程序入口地址:0000H外部中断0入口地址:0003H定时器0溢出中断入口地址:000BH外部中断1入口地址:00013H定时器1溢出中断入口地址:001BH串行口中断入口地址:0023H定时器2…...
数据结构与算法_动态顺序表
顺序表是线性表的一种。 线性表是n个具有相同特性的数据元素的有限序列。 逻辑上,它们是线性结构,是一条连续的直线;但是在物理上,它们通常以数组和链式结构存储。 常见的线性表有顺序表、栈、队列、字符串等。 顺序表是用一段…...
逃避浏览器JS检测打开开发者工具
20230304 - 0. 引言 看到一些视频网站之后,想把视频离线下载下来怎么办?直接的方法是通过开发者工具来查看网络流量,一般可以在传输的请求类型中搜索m3u8,然后找到这部分请求,然后利用某些播放器或者下载器直接下载。…...

ceph介绍、原理、架构、算法...个人学习记录
前言 之前公司安排出差支援非结构化项目,采用springcloud(redismysql数据冷热处理)s3escephkafka还涉及一些区块链技术等等…,在与大佬的沟通交流下对ceph产生了兴趣,私下学习记录一下;后续工作之余会采用上面相关技术栈手动实现不…...

Spring MVC源码解析——HandlerMapping(处理器映射器)
Sping MVC 源码解析——HandlerMapping处理器映射器1. 什么是HandlerMapping2. HandlerMapping2.1 HandlerMapping初始化2.2 getHandler解析3. getHandlerInternal()子类实现3.1 AbstractUrlHandlerMapping与AbstractHandlerMethodMapping的区别3.2 AbstractUrlHandlerMapping3…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...