1.给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
int maxArea(std::vector<int>& height)
{
int maxArea = 0;
int left = 0, right = height.size() - 1;
while (left < right)
{
int bottom = right - left;
int shortRound = height[left] > height[right] ? height[right--] : height[left++];
if (maxArea < shortRound * bottom)
maxArea = shortRound * bottom;
}
return maxArea;
}
2.给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
int firstMissingPositive(std::vector<int>& nums)
{
int index = 1, val_1, val_2;
for (size_t i = 0; i < nums.size(); i++)
{
while (0 < nums[i] && nums[i] <= nums.size() && nums[i] != nums[nums[i] - 1])
std::swap(nums[i], nums[nums[i] - 1]);
}
for (size_t j = 0; j < nums.size(); j++, index++)
{
if (nums[j] != j + 1)
break;
}
return index;
}
3.给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
bool canJump(std::vector<int>& nums)
{
int i = 0;
do
{
if (i >= nums.size() - 1)
return true;
if (nums[i] == 0) {
int j = i - 1;
while (j >= 0){
if (j + nums[j] > i) {
i = j + nums[j];
break;
}
j--;
}
if (j < 0)
return false;
continue;
}
i++;
} while (true);
}