This commit is contained in:
youngyangyang04
2020-06-06 11:32:07 +08:00
parent 880ffa83b0
commit a827210c2d
7 changed files with 80 additions and 13 deletions

View File

@ -0,0 +1,47 @@
```
/**
* 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:
// 题目中我们为什么定义了一个 新的head
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* head = new ListNode();
ListNode* index = head;
while(l1 != nullptr && l2 != nullptr) { // 注意null 和nullptr的区别
if (l1->val < l2->val) {
index->next = l1;
l1 = l1->next;
} else {
index->next = l2;
l2 = l2->next;
}
index = index->next;
}
if (l1 != nullptr) {
index->next = l1;
l1 = l1->next;
}
if (l2 != nullptr) {
index->next = l2;
l2 = l2->next;
}
ListNode* tmp = head; // 注意清理内存,不清理也没事
head = head->next;
delete tmp;
return head;
// return head->next
}
};
```

View File

@ -1,4 +1,3 @@
## 题目地址
https://leetcode-cn.com/problems/search-insert-position/

View File

@ -28,10 +28,10 @@ public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0)); // 使用vector定义一个二维数组
int startx = 0, starty = 0; // 定义每循环一个圈的起始位置
int loop = n / 2; // 每个圈循环几次
int mid = n / 2; // 矩阵中间的位置例如n为3 中间的位置就是(11)n为5中间位置为(3, 3)
int count = 1; // 用来计数
int offset = 1; // 每一圈循环,需要偏移的位置
int loop = n / 2; // 每个圈循环几次例如n为奇数3那么loop = 1 只是循环一圈,矩阵中间的值需要单独处理
int mid = n / 2; // 矩阵中间的位置例如n为3 中间的位置就是(11)n为5中间位置为(2, 2)
int count = 1; // 用来给矩阵中每一个空格赋值
int offset = 1; // 每一圈循环,需要控制每一条边遍历的长度
int i,j;
while (loop --) {
i = startx;
@ -59,7 +59,7 @@ public:
startx++;
starty++;
// offset 控制每一圈遍历的长度
// offset 控制每一圈里每一条边遍历的长度
offset += 2;
}

View File

@ -0,0 +1,21 @@
## 题目地址
https://leetcode-cn.com/problems/delete-node-in-a-linked-list/
## 思路
题目中已经说了是非末尾节点,所以不用对末尾节点的情况经行判断
**链表中所有节点的值都是唯一的。** 题目题意强调这一点,是为什么,因为 我们删除的node在内存地址 删除的并不是这个。
## 代码
```
class Solution {
public:
void deleteNode(ListNode* node) {
node->val = node->next->val;// 将前一个值赋给当前node
node->next = node->next->next; // 将当前node的next 指向下下node
}
};
```

View File

@ -21,13 +21,13 @@ public:
bool canConstruct(string ransomNote, string magazine) {
for (int i = 0; i < magazine.length(); i++) {
for (int j = 0; j < ransomNote.length(); j++) {
if (magazine[i] == ransomNote[j]) {
ransomNote.erase(ransomNote.begin() + j);
if (magazine[i] == ransomNote[j]) { // 在ransomNote中找到和magazine相同的字符
ransomNote.erase(ransomNote.begin() + j); // ransomNote删除这个字符
break;
}
}
}
if (ransomNote.length() == 0) {
if (ransomNote.length() == 0) { // 如果ransomNote为空则说明magazine的字符可以组成ransomNote
return true;
}
return false;
@ -39,7 +39,7 @@ public:
我们想一想优化解法
## 优化解法
## 字典计数法(哈希策略)
因为题目所只有小写字母,那我们可以采用空间换区时间的哈希策略, 用一个长度为26的数组还记录magazine里字母出现的次数然后再用ransomNote去验证这个数组是否包含了ransomNote所需要的所有字母。
代码如下:
@ -52,11 +52,11 @@ public:
bool canConstruct(string ransomNote, string magazine) {
int record[26] = {0};
for (int i = 0; i < magazine.length(); i++) {
record[magazine[i]-'a'] ++;
record[magazine[i]-'a'] ++; // 通过recode数据记录 magazine里各个字符出现次数
}
for (int j = 0; j < ransomNote.length(); j++) {
record[ransomNote[j]-'a']--;
if(record[ransomNote[j]-'a'] < 0) {
record[ransomNote[j]-'a']--; // 遍历ransomNote在record里对应的字符个数做--操作
if(record[ransomNote[j]-'a'] < 0) { // 如果小于零说明 magazine里出现的字符ransomNote没有
return false;
}
}