【算法挨揍日记】day03——双指针算法_有效三角形的个数、和为s的两个数字

611. 有效三角形的个数

611. 有效三角形的个数https://leetcode.cn/problems/valid-triangle-number/

题目描述:

给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。

解题思路:

本题是一个关于三角形是否能成立的题目,首先我们假设三角形的三边(a,b,c),我们要保证两边之和大于第三边

题目给我们nums是乱序的,如果我们一个个abc去实验就是会超时(时间复杂度O^3)

当我们将sort排序一下,这样的话假设a<b<c的情况下,我们就只要去判断a+b>c是否成立!

这里我们遍历每个c(从后往前),这样时间复杂度就变成了N^2+NlogN也就是N^2

解题代码:

cpp 复制代码
class Solution {
public:
    int triangleNumber(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        //假设a<b<c
        int num=0;
        int n=nums.size();
        for(int i=n-1;i>=2;i--)
        {
            int left=0;
            int right=i-1;
            while(left<right)
            {
                if(nums[left]+nums[right]>nums[i])
                {
                    num+=(right-left);
                    right--;
                }
                else
                {
                    left++;
                }
            }
        }
        return num;
    }
};

剑指 Offer 57. 和为s的两个数字

剑指 Offer 57. 和为s的两个数字https://leetcode.cn/problems/he-wei-sde-liang-ge-shu-zi-lcof/

题目描述:

输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。

解题思路:

首先本题是升序数组,这里如果我们用暴力的话会超时

这里我们使用双指针,我们让一个指向头left一个指向尾right,这里left、right和target会有三种关系

我们假设sub=right-left

第一种情况很显然直接返回就好了我们来研究一下第二种和第三种情况:

解题代码:

cpp 复制代码
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int n=nums.size();
        int left=0;
        int right=n-1;
        while(nums[right]>target)
        {
            right--;
        }
        while(left<right)
        {
            int sub=target-nums[right];
            if(sub==nums[left])
            {
                return {nums[left],nums[right]};
            }
            else if(sub>nums[left])
            {
                left++;
            }
            else//sub<nums[left]
            {
                right--;
            }
        }
        return {-1,-1};
    }
};

相关推荐
木心月转码ing13 分钟前
Hot100-Day10-T438T438找到字符串中所有字母异位词
算法
HelloReader1 小时前
Wi-Fi CSI 感知技术用无线信号“看见“室内的人
算法
颜酱4 小时前
二叉树分解问题思路解题模式
javascript·后端·算法
qianpeng8975 小时前
水声匹配场定位原理及实验
算法
董董灿是个攻城狮17 小时前
AI视觉连载8:传统 CV 之边缘检测
算法
AI软著研究员1 天前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish1 天前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱1 天前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者2 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮2 天前
大模型连载2:初步认识 tokenizer 的过程
算法