#移动0
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
所有非0放在左边,0放在右边,我们需要两个指针i,j,j考虑成存放非0元素,i去遍历;当遇到nums[i]为非0,就将nums[i]和nums[j]交换。这一步草稿纸上画一画就很清晰了,或者去看力扣上的动画解析。
python代码:
class Solution(object):
def movezeroes(self,nums):
if not nums:
return 0
j = 0
#两个指针i和j
for i range(0,len(nums)):
if nums[i]:
nums[j],nums[i] = nums[i],nums[j]
j +=1
其实python的交换操作赋值是很慢的,下面介绍另一种思路:
同样是双指针i,j,i用来遍历数组,j用来存放非零元素;当遇到非0元素就放到nums[j]中,并且判断此时的i,j,如果i!=j或者i>j,说明前面肯定遇到了一个0,那么相当于将前面这个0和此时遇到的非0进行了交换,将nums[i]赋值0;
class Solution:{
public:
void movezeroes(vector<int>& nums){
int j = 0;//存储非0变量
for(int i = 0;i<nums.size();i++){
if (nums[i] != 0){
nums[j] = nums[i];
if(i>j){
nums[i] = 0;
}
}
j++;
}
}
}
来源:力扣(LeetCode)
附上题目链接:[link]https://leetcode-cn.com/problems/move-zeroes
#删除数组中重复的元素并返回新的数组长度
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
示例 1:
给定数组 nums = [1,1,2],
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
你不需要考虑数组中超出新长度后面的元素。
还是考虑双指针,i去遍历,j来存放,当nums[j]!=nums[i]时,将nums[i]的值放入j+1的位置。
class Solution{
public:
int removeDuplicates(vector<int>& nums){
if(nums.size()==0)
return 0;
int j = 0;
for(int i = 1;i<nums.size();i++){
if (nums[j] != nums[i]){
j++;
nums[j] = nums[i];
}
}
return j+1;
}
}
来源:力扣(LeetCode)
链接:[link]https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
#盛水最多的容器
给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
还是考虑双指针,容器盛水我们知道以以最低的地方为准,要盛最多的水,要尽量宽尽量高。宽是在数组两端时最宽。我们一个指针从端点遍历,一个指针从末尾遍历,去找到最宽最高的容器,当两指针相遇时结束遍历,并在这个过程中不断更新容积最大值。
class Solution{
public:
int maxarea(vector<int>& height){
int j = height.size()-1;
int ans = 0,area=0;
while(i<j){
area = min(height[i],height[j])*(j-i);
ans = max(ans,area);
if(i<j){
++i;
}
else{
--j;
}
}
return ans;
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/container-with-most-water