算法学习——LeetCode力扣补充篇9(912. 排序数组、21. 合并两个有序链表、33. 搜索旋转排序数组、103. 二叉树的锯齿形层序遍历)

算法学习——LeetCode力扣补充篇9

在这里插入图片描述

912. 排序数组

912. 排序数组 - 力扣(LeetCode)

描述

给你一个整数数组 nums,请你将该数组升序排列。

示例

示例 1:

输入:nums = [5,2,3,1]
输出:[1,2,3,5]

示例 2:

输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]

提示

1 <= nums.length <= 5 * 104
-5 * 104 <= nums[i] <= 5 * 104

代码解析

冒泡排序
class Solution {
public:vector<int> sortArray(vector<int>& nums) {for(int i=0 ; i<nums.size() ; i++){for(int j=i ; j<nums.size();j++){if(nums[i] > nums[j]) swap(nums[i],nums[j]);}}return nums;}
};
快速排序
class Solution {
public:void quickSort(vector<int>& nums,int left ,int right){int mid_value =  nums[left + (right-left)/2] ;int i= left ;int j= right;while(i <= j){while(nums[i] < mid_value) i++;while(nums[j] > mid_value) j--;if(i <= j){int tmp = nums[j];nums[j] = nums[i];nums[i] = tmp;i++;j--;}}if(left < j) quickSort(nums,left,j);if(i < right) quickSort(nums,i,right);}vector<int> sortArray(vector<int>& nums) {quickSort(nums,0,nums.size()-1);return nums;}
};
归序并排
class Solution {vector<int> tmp;void mergeSort(vector<int>& nums, int l, int r) {if (l >= r) return;int mid = (l + r) >> 1;mergeSort(nums, l, mid);mergeSort(nums, mid + 1, r);int i = l, j = mid + 1;int cnt = 0;while (i <= mid && j <= r) {if (nums[i] <= nums[j]) {tmp[cnt++] = nums[i++];}else {tmp[cnt++] = nums[j++];}}while (i <= mid) {tmp[cnt++] = nums[i++];}while (j <= r) {tmp[cnt++] = nums[j++];}for (int i = 0; i < r - l + 1; ++i) {nums[i + l] = tmp[i];}}
public:vector<int> sortArray(vector<int>& nums) {tmp.resize((int)nums.size(), 0);mergeSort(nums, 0, (int)nums.size() - 1);return nums;}
};

21. 合并两个有序链表

21. 合并两个有序链表 - 力扣(LeetCode)

描述

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例

示例 1:

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例 2:

输入:l1 = [], l2 = []
输出:[]

示例 3:

输入:l1 = [], l2 = [0]
输出:[0]

提示

两个链表的节点数目范围是 [0, 50]
-100 <= Node.val <= 100
l1 和 l2 均按 非递减顺序 排列

代码解析

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {ListNode *head = new ListNode;ListNode *tmp = head;while(list1 != nullptr || list2 != nullptr){if((list1 != nullptr && list2 != nullptr && list1->val <= list2->val)||(list1 != nullptr && list2 == nullptr)){tmp->next = list1;tmp = tmp->next;list1 = list1->next;}if((list1 != nullptr && list2 != nullptr && list1->val > list2->val)||(list1 == nullptr && list2 != nullptr)){tmp->next = list2;tmp = tmp->next;list2 = list2->next;}}return head->next;}
};

33. 搜索旋转排序数组

33. 搜索旋转排序数组 - 力扣(LeetCode)

描述

整数数组 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 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。

你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

示例

示例 1:

输入:nums = [4,5,6,7,0,1,2], target = 0
输出:4

示例 2:

输入:nums = [4,5,6,7,0,1,2], target = 3
输出:-1

示例 3:

输入:nums = [1], target = 0
输出:-1

提示

1 <= nums.length <= 5000
-104 <= nums[i] <= 104
nums 中的每个值都 独一无二
题目数据保证 nums 在预先未知的某个下标上进行了旋转
-104 <= target <= 104

代码解析

遍历法
class Solution {
public:int search(vector<int>& nums, int target) {for(int i=0 ; i<nums.size() ;i++)if(nums[i] == target) return i;return -1;}
};
二分查找法
class Solution {
public:int find(vector<int>& nums, int target , int left ,int right){if(left > right) return -1;if(nums[right] > nums[left] && nums[left] > target) return -1;else if(nums[right] > nums[left] && nums[right] < target) return -1;if(left == right && nums[left] == target) return left;else if(left == right && nums[left] != target) return -1;int mid = (left+right)/2;if(nums[mid] == target) return mid;if(left < right){int left_value = find(nums,target,left,mid-1);int right_value = find(nums,target,mid+1,right);if(left_value != -1) return left_value;if(right_value != -1) return right_value;}return -1;}int search(vector<int>& nums, int target) {return find(nums,target,0,nums.size()-1);}
};

103. 二叉树的锯齿形层序遍历

103. 二叉树的锯齿形层序遍历 - 力扣(LeetCode)

描述

给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

示例

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[20,9],[15,7]]

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

提示

树中节点数目在范围 [0, 2000] 内
-100 <= Node.val <= 100

代码解析

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<vector<int>> zigzagLevelOrder(TreeNode* root) {queue<TreeNode*> my_que;vector<vector<int>> result;if(root == nullptr) return result;bool flag = false;my_que.push(root);while(my_que.size() != 0){int size = my_que.size();vector<int> tmp;for(int i=0 ; i<size ;i++){TreeNode* tmp_node = my_que.front();my_que.pop();tmp.push_back(tmp_node->val);if(tmp_node->left != nullptr) my_que.push(tmp_node->left);if(tmp_node->right != nullptr) my_que.push(tmp_node->right);}if(flag == true) reverse(tmp.begin(),tmp.end());result.push_back(tmp);flag = !flag;tmp.clear();}return result;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/625844.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 179 in Python. Largest Number (最大数)

寻找最大数的逻辑简单&#xff0c;但如何对两数比较组成更大的整数是一个重点。例如示例2中如何区分3与30谁放在前面以及3与34谁放在前面是一个难点&#xff0c;本文通过采用functools中的自定义排序规则cmp_to_key()来判断上述情况&#xff0c;并给出代码实现。 示例&#xf…

【静态分析】软件分析课程实验-前置准备

课程&#xff1a;南京大学的《软件分析》课程 平台&#xff1a;Tai-e&#xff08;太阿&#xff09;实验作业平台 1. 实验概述 Tai-e 是一个分析 Java 程序的静态程序分析框架&#xff0c;相比于已有的知名静态程序分析框架&#xff08;如 Soot、Wala 等&#xff09;&#xf…

【电控笔记3.5】三相逆变器

基础 大小调变指标ma 频率调变指标mf 载波频率:pwm频率

安科瑞智能照明系统在办公建筑中的应用

安科瑞薛瑶瑶18701709087 摘要&#xff1a;应用智能照明系统可以提升照明管理水平、降低运营成本、节约能源。文章结合办公建筑照明设计实例&#xff0c;分析了办公建筑智能照明系统的设计要点。首先介绍了智能照明系统的工作原理和应用优势&#xff0c;然后在此基础上总结了智…

开源模型应用落地-chatglm3-6b-streamlit-入门篇(八)

一、前言 早前的文章&#xff0c;我们都是通过输入命令的方式来使用Chatglm3-6b模型。现在&#xff0c;我们可以通过使用Streamlit&#xff0c;通过一个界面与模型进行交互。这样做可以减少重复加载模型和修改代码的麻烦&#xff0c; 让我们更方便地体验模型的效果。 开源模型应…

如果补货机器人也开始搬砖

过去几年&#xff0c;如果一位顾客的欲购商品疑似缺货&#xff0c;“请稍等&#xff0c;我去后台查一下”便是最常听到的一句话。随着过去几年劳动力短缺的加剧&#xff0c;货架并不总像许多人习惯的那样满满当当。为减轻不断补货的负担&#xff0c;使员工可以将精力集中于其他…

【C++】一篇文章带你深入了解vector

目录 一、vector的介绍二、 标准库中的vector2.1 vector的常见接口说明2.1.1 vector对象的常见构造2.1.1.1 [无参构造函数](https://legacy.cplusplus.com/reference/vector/vector/vector/)2.1.1.2 [有参构造函数&#xff08;构造并初始化n个val&#xff09;](https://legacy.…

【数据分析面试】22.补充缺失数据(Python:数据插值interpolate()用法)

题目 数据集来自一个气候研究组织&#xff0c;列表里带有不同城市每日温度读数的时间序列数据。该数据框有三列&#xff1a;date、city 和 temperature。 由于数据记录问题&#xff0c;某些日期的温度读数可能丢失。该组织需要每天的温度读数&#xff0c;因此他们要求你用线性…

蓝桥杯2024年第十五届省赛真题-R 格式

找到规律后如下&#xff0c;只需要用高精度加法和四舍五入&#xff08;本质也是高精度加法就能做&#xff09;&#xff0c;如果没有找到规律&#xff0c;就得自己写高精度乘法和加法&#xff0c;不熟练很容易错。 //#include<bits/stdc.h> #include<iostream> #i…

基于CST的微带线直角不连续性仿真分析

PCB走线过程中经常出现直角拐弯&#xff0c;导致的阻抗不连续性使得电路性能的恶化&#xff0c;因为这种不连续性会引入寄生电容&#xff0c;从而引起相位和振幅误差、输入与输出失配以及寄生耦合&#xff0c;消除这些效应的方法是改变直角拐弯的构造&#xff0c;如下图所示&am…

网工基础协议——TCP/UDP协议

TCP和UDP的不同点&#xff1a; TCP(Transmission Control Protocol&#xff0c;传输控制协议)&#xff1b; UDP(User Data Protocol&#xff0c;用户数据报协议)&#xff1b; TCP&#xff1a;传输控制协议&#xff0c;面向连接可靠的协议&#xff0c;只能适用于单播通信&…

slRegisterDistribution failed with error: 0x8000000d Error: 0x8000000d ?

powershell用管理员打开&#xff0c;输入Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux 怎么用管理员权限打开powershell&#xff1f;