前言
跟着英雄哥打卡第三十五天
[专题跳转->《算法零基础100讲》]
[万人千题社区跳转]
一、合并两个有序数组
跳转力扣:88. 合并两个有序数组
难度:★★☆☆☆
说明:双指针,创建一个 t e m p temp temp 数组(偷懒),每次比较 n u m s 1 nums1 nums1 和 n u m s 2 nums2 nums2 的元素,将小的放进 t e m p temp temp 数组中,遍历结束最后赋值给 n u m s 1 nums1 nums1
代码如下(示例):
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
vector<int> temp;
int i = 0, j = 0;
while (i < m && j < n) {
if (nums1[i] < nums2[j]) {
temp.push_back(nums1[i ++]);
}
else temp.push_back(nums2[j ++]);
}
while (i < m) temp.push_back(nums1[i ++]);
while (j < n) temp.push_back(nums2[j ++]);
nums1 = temp;
}
};
二、有效三角形的个数
跳转力扣:611. 有效三角形的个数
难度:★★☆☆☆
说明:双指针,参考[解题报告] 《算法零基础100讲》(第34讲) 排序入门 - 选择排序中的第一题
三、对链表进行插入排序
跳转力扣:147. 对链表进行插入排序
难度:★★☆☆☆
说明:链表,插入排序
代码如下(示例):
/**
* 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* insertionSortList(ListNode* head) {
if (head == nullptr) {
return head;
}
ListNode* h = new ListNode(0); // 哑结点
h -> next = head;
ListNode* cur = head -> next;
ListNode* sort = head;
while (cur != nullptr) {
if (sort -> val <= cur -> val) { // 符合升序 升序链表往下走
sort = sort -> next;
}
else { // 出现非递增
ListNode* pre = h; // 哑结点发挥作用
while (pre -> next -> val <= cur -> val) {//从前往后找到小于cur->val的最大值
pre = pre -> next;
}
// 巧妙地插入其中
sort -> next = cur -> next;
cur -> next = pre -> next;
pre -> next = cur;
}
cur = sort -> next; // 每一次插入排序后cur定位在已排序的最后一个结点的下一个节点
}
return h -> next;
}
};
};