11. 盛最多水的容器
给定一个长度为
n的整数数组height。有n条垂线,第i条线的两个端点是(i, 0)和(i, height[i])。找出其中的两条线,使得它们与
x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。
说明: 你不能倾斜容器。
朴素双指针。起始状态是底边最长,往中间收缩是想尝试用缩小底边换高度来让容积变大。
注意,左右边界应该移动短边,因为短边决定高度。
int maxArea(vector<int>& height) {
int size = height.size();
int right = size - 1;
int left = 0;
int ans = 0;
while (left<right) {
ans = max((right-left)*min(height[left],height[right]),ans);
if(height[left]<=height[right]){//移动短边,企图让短边变长,才能装更多,一样高可随便哪边
left++;
}
else right--;
}
return ans;
}
283. 移动零
给定一个数组
nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。
可能是最简单的双指针。快指针在前面判断条件,慢指针根据判断结果原地修改数组
void moveZeroes(vector<int>& nums) {
int left = 0;
int right = 0;
while(right < nums.size()){
if(nums[right]!=0){
nums[left] = nums[right];
left++;
}
right++;
}
for(int i = left; i < nums.size();i++){
nums[i] = 0;
}
}
19. 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第
n个结点,并且返回链表的头结点。
用虚拟头节点可以避免修改头节点出现的问题。
while(fast),最后快指针停在nullptr
while(fast->next),最后快指针停在尾节点
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummy =new ListNode(0);
dummy->next = head;
ListNode* fast = dummy;
ListNode* slow = dummy;
while(n--){
fast = fast->next; //提前走n步
}
while(fast->next){
fast = fast->next;
slow = slow->next;
}
slow->next = slow->next->next; //slow需要停在待删除的前一节点
return dummy->next;
}