数组

11. 盛最多水的容器

给定 n 个正整数 a1,a2,…,an,其中每个点的坐标用(i, ai)表示。 画 n 条直线,使得线 i 的两个端点处于(i,ai)和(i,0)处。请找出其中的两条直线,使得他们与 X 轴形成的容器能够装最多的水。

注意:你不能倾斜容器,n 至少是2。

class Solution {
public:
    int maxArea(vector<int>& height) {
        int left = 0;
        int right = height.size()-1;

        int result = 0;
        int temp = 0;

        //容量 = 矮的一边*区间长度
        while(left < right)
        {
            if(height[left] < height[right])
            {
                temp = height[left];
            }
            else
            {
                temp = height[right];
            }
            result = max(result, temp*(right - left));
            //往中间逼近时,高度必须要比原来更高才能装更多的水
            while(left < right && temp >= height[left])
               ++left;
            while(left < right && temp >= height[right])
               --right;

        }

        return result;
    }
};

26. 删除排序数组中的重复项

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。


class Solution {
public:

    int removeDuplicates(vector<int>& nums) {

        //由于数组是排好序的,做法比较简单,每一组相同的数只取一个,

        int len = 0;               //返回长度

        if(!nums.size())
            return len;
        for(auto it = nums.begin(); it != nums.end(); ++it)
        {
            if(nums[len] != *it)
            {
                ++len;
                nums[len] = *it;
            }
        }

        return len+1;

    }
};

55. 跳跃游戏

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个位置。

示例 1:

输入: [2,3,1,1,4]
输出: true
解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。
示例 2:

输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。

思路:只要能跳到最后就行,这里就直接寻找每次最大跳跃距离。
i+nums[i] —当前位置能跳到的最大位置
maxlen —-i之前能跳到的最大位置

class Solution {
public:
    bool canJump(vector<int>& nums) {

        int nlen = nums.size();      //数组长度
        int maxlen = 0;              //最长到达的长度
        for(int i = 0; i < nlen; ++i)
        {
            maxlen = max(maxlen, i+nums[i]);          //通过每个元素判断最长跳跃长度
            if(maxlen == i && i != (nlen-1) )
                return false;                 //  最长等于自身,说明跳不过0,只能结束
        }

        return true;

    }

};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值