Content
237. Delete Node in a Linked List
Description
Analysis & Solution
数据结构里的基本操作。无法访问当前节点的前驱节点,我们就不能“直接”删除当前节点。我们可以用当前节点存储其后继节点的值。然后删除后继节点,就间接实现了节点删除。
Code
void deleteNode(ListNode* node)
{
ListNode *next = node->next;
node->val = next->val;
node->next = next->next;
}
时间复杂度为 O ( 1 ) O(1) O(1)。
238. Product of Array Except Self
Description
Analysis & Solution
首先最朴素的想法是求出输入所有元素的乘积product,output中每一位即乘积product除以当前nums[i]即可。但是如果nums中出现0,这种方法就不可行了。
我们可以对nums的每个元素算两个值,第一个是其左边元素的积,从左向右遍历一次即可;第二个是其右边元素的积,从右向左遍历。最后每个元素的左右积相乘即为最终结果。
Code
vector<int> productExceptSelf(vector<int>& nums)
{
int n = nums.size();
vector<int> res(n, 1);
int temp = 1;
for(int i = 0; i < n; i++)
{
res[i] = temp;
temp *= nums[i];
}
temp = 1;
for(int i = n - 1; i >= 0; i--)
{
res[i] *= temp;
temp *= nums[i];
}
return res;
}
时间复杂度为 O ( n ) O(n) O(n)。
292. Nim Game
Description
Analysis & Solution
观察题目,每次拿走1-3颗石头。如果石头是4个,先手无论拿几颗,后手都可以获胜。类似地,只要石头是4的倍数,则后手必赢。那么石头不是4的倍数时,先手就会获胜,直接判断输入是否是4的倍数即可。
Code
bool canWinNim(int n) {
return n % 4 != 0;
}
时间复杂度为 O ( 1 ) O(1) O(1)。