【每日刷题】Day102

【每日刷题】Day102

🥕个人主页:开敲🍉

🔥所属专栏:每日刷题🍍

🌼文章目录🌼

1. 11. 盛最多水的容器 - 力扣(LeetCode)

2. 611. 有效三角形的个数 - 力扣(LeetCode)

3. 和为S的两个数字_牛客题霸_牛客网 (nowcoder.com)

1. 11. 盛最多水的容器 - 力扣(LeetCode)

//思路:双指针。

//定义两个指针,left和right,分别指向数组开头元素和最后一个元素。

//计算两指针形成容器的容积,并记录最大值。

//如果left指向的值小于right,则left++向后遍历;如果right指向的值小于left,则right--向前遍历。

//返回记录的最大容积

class Solution {

public:

    int maxArea(vector<int>& height)

    {

        int left = 0,right = height.size()-1,max = 0;

        while(left<right)

        {

            int high = height[left]>height[right]?height[right]:height[left];

            int length = right-left;

            int volume = high*length;

            max = max>volume?max:volume;

            if(height[left]<height[right])

                left++;

            else

                right--;

        }

        return max;

    }

};

2. 611. 有效三角形的个数 - 力扣(LeetCode)

//思路:双指针+排序。

//本题如果采用暴力解法,三层循环遍历所有可能的三元组,时间复杂度就太大了,必然会超出时间限制。

//而我们的思路则是在暴力遍历的想法上面进行优化,具体思路看图:

class Solution {

public:

    int triangleNumber(vector<int>& nums)

    {

        int ans = 0;

        int max = nums.size()-1;

        sort(nums.begin(),nums.end());

//max>=2是因为最少要组成一个三元组

        while(max>=2)

        {

//寻找能与max组成三角形的二元组

            int left = 0;

            int right = max-1;

//当left==right,当前max的循环结束

            while(left<right)

            {

//如果当前left+right都>max,则之间的所有二元组也一定>max

                if(nums[left]+nums[right]>nums[max])

                {

                    ans+=(right-left);

                    right--;

                }

//如果left+right<=max,那么left向后遍历

                else

                    left++;

            }

            max--;

        }

        return ans;

    }

};

3. 和为S的两个数字_牛客题霸_牛客网 (nowcoder.com)

//思路:双指针。

//定义两个指针,left和right,分别指向头尾元素,判断它们的和与sum的关系:

//注:下述操作可行是因为所给的为有序数组

//① 如果val_left + val_right == sum 则返回结果

//② 如果 val_left + val_right > sum 则right--,使val_right减小

//③ 如果 val_left + val_right > sum 则left++,使val_left增大

class Solution {

public:

    vector<int> FindNumbersWithSum(vector<int> array,int sum)

    {

        vector<int> ans;

        int left = 0;

        int right = array.size()-1;

        while(left<right)

        {

            int val_left = array[left];

            int val_right =array[right];

//找到结果,返回结果

            if(val_left+val_right==sum)

            {

                ans.push_back(val_left);

                ans.push_back(val_right);

                break;

            }

//使val_right减小

            else if(val_left+val_right>sum)

                right--;

//使val_left增大

            else

                left++;

        }

        return ans;

    }

};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值