1 顺序表

一、数组中两元素的最大乘积

1、题目链接

1464.数组中两元素的最大乘积

2、题目简介

给你一个整数数组nums,请你选择数组的两个不同下标i 和j,使(nums[i]-1)*(nums[j]-1)取得最大值。请你计算并返回该式的最大值。

3、涉及知识点

顺序表、贪心

4、分析

一次遍历,维护最大和次大值
因为我们只需要得到数组中两个最大的元素,我们可以在从左到右遍历的过程中维护两个变量a,b来表示遍历过程中的最大和次大元素,那么一次遍历就可以得到数组中两个最大的元素。
遍历过程只有两种情况的出现:

  • nums[i] > a > b
  • a > nums[i] > b

5、完整解答

法一:时间复杂度O(N2)

class Solution
{
public:
	int maxProduct(vector<int> &nums)
	{
		int res = 0;
		for (int i = 0; i < nums.size(); i++)
		{
			for (int j = 0; j < nums.size(); j++)
			{
				if (i != j)
				{
					int x = (nums[i] - 1) * (nums[j] - 1);
					if (x > res)
						res = x;
				}
			}
		}
		return res;
	}
};

法二:时间复杂度O(N)

class Solution
{
public:
	int maxProduct(vector<int> &nums)
	{
		// a表示最大值  b表示次大值
		int a = nums[0], b = nums[1];
		if (a < b)
			swap(a, b);

		for (int i = 2; i < nums.size(); i++)
		{
			// nums[i] > a > b
			if (nums[i] > a)
			{
				b = a;
				a = nums[i];
			}// a > nums[i] > b 
			else if (nums[i] > b)
			{
				b = nums[i];
			}
		}
		return (a - 1) * (b - 1);
	}
};

二、最大连续1的个数

1、题目链接

485.最大连续1的个数

2、题目简介

给定一个二进制数组nums,计算其中最大连续1的个数。

3、涉及知识点

顺序表、遍历

4、分析

依次判断每个数是否为1,若为1,则连续1的个数+1,否则清0,用maxcount记录最大值

5、完整解答

时间复杂度:O(N)

class Solution
{
public:
	int findMaxConsecutiveOnes(vector<int> &nums)
	{
		int maxcount = 0;
		int count = 0; // 记录当前遇到连续1的个数
		for (int i = 0; i < nums.size(); i++)
		{
			if (nums[i] == 1)
			{
				count++;
			}
			else
			{
				count = 0;
			}
			maxcount = max(maxcount, count);
		}
		return maxcount;
	}
};

三、值相等的最小索引

1、题目链接

2057.值相等的最小索引

2、题目简介

给你一个下标i从0开始的整数数组nums,返回nums中满足 i mod 10 ==nums[i]的最小下标i;如果不存在这样的下标,返回-1。

3、设计知识点

顺序表、遍历

4、分析

遍历即可

5、完整解答

时间复杂度:O(N)

class Solution
{
public:
	int smallestEqual(vector<int> &nums)
	{
		int minindex = 0;
		int index = 0;
		for (int i = 0; i < nums.size(); i++)
		{
			if (i % 10 == nums[i])
				return i;
		}
		return -1;
	}
};

四、移除元素

1、题目链接

27.移除元素

2、题目简介

给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用O(1)额外空间并原地修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

3、涉及知识点

顺序表

4、分析

因为题目给了提示,顺序可以改变,所以我们一次遍历,将当前数与末位的数字交换,size- -即可,注意交换后的数,也是val(使用while,不用if)

5、完整解答

class Solution
{
public:
	int removeElement(vector<int> &nums, int val)
	{
		int len = nums.size();
		for (int i = 0; i < len; i++)
		{
			while (i < len && nums[i] == val)
			{
				swap(nums[len - 1], nums[i]);
				len--;
			}
		}
		return len;
	}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值