文章目录
数组
6. 螺旋矩阵 II
思路:
从外向内一圈一圈填充数字,为了方便,将一圈切分为等长的 4 段,如下图所示:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> result(n, vector<int>(n, 0));
int loop = n / 2, cnt = 1; // loop:需要填充的圈数; cnt:当前正在填充的圈数
if (n & 1) result[loop][loop] = n * n; // n 为奇数时中间的一个空单独填充
int x = 0, y = 0; // 记录当前填充到哪个位置了
int index = 1; // 当前位置应该填充的数
while (loop--) {
for (; x < n - cnt; x++) result[y][x] = index++; // 上一行 左-》右
for (; y < n - cnt; y++) result[y][x] = index++; // 右一列 上-》下
for (; x > cnt - 1; x--) result[y][x] = index++; // 下一行 右-》左
for (; y > cnt - 1; y--) result[y][x] = index++; // 左一列 下-》上
cnt++; // 当前填充的圈数加一
// 填充完一圈,起始点的横纵坐标向右下移动一格
x++;
y++;
}
return result;
}
};
链表
2. 移除链表元素
思路1:
需要注意头节点的值就是 val 的情况,要找到第一个值不是 val 的节点。
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
// 如果头节点就是 val 要特殊处理
while (head) {
if (head->val == val) head = head->next;
else break;
}
ListNode* p = head;
while (p != NULL && p->next != NULL) {
while (p->next && p->next->val == val) p->next = p->next->next;
p = p->next;
}
return head;
}
};
思路优化:
看了卡哥的实现,发现自己的不足之处:没有将删除的节点释放
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
// 如果头节点就是 val 要特殊处理
while (head != NULL && head->val == val) {
ListNode* tmp = head;
head = head->next;
delete tmp; // 删除 tmp 地址处的节点(释放节点空间)
}
// val 非头节点的情况
ListNode* cur = head;
while (cur != NULL && cur->next != NULL) {
if (cur->next->val == val) { // 要提前判断下一个节点的值,否则来不及
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
} else {
cur = cur->next;
}
}
return head;
}
};
思路2:
设置一个虚拟头节点,可以将原来的链表头节点和其余节点按同样的方法处理
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode* cur = dummyHead;
while (cur && cur->next) {
if (cur->next->val == val) {
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
} else {
cur = cur->next;
}
}
head = dummyHead->next;
delete dummyHead;
return head;
}
};