力扣双指针经典例题,移动0,去重,装最多水的容器笔记

#移动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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值