文章目录
一、数组中两元素的最大乘积
1、题目链接
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、题目链接
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、题目链接
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、题目链接
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;
}
};