【算法挨揍日记】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};
    }
};

相关推荐
workflower3 小时前
单元测试-例子
java·开发语言·算法·django·个人开发·结对编程
MicroTech20255 小时前
微算法科技(MLGO)研发突破性低复杂度CFG算法,成功缓解边缘分裂学习中的掉队者问题
科技·学习·算法
墨染点香5 小时前
LeetCode 刷题【126. 单词接龙 II】
算法·leetcode·职场和发展
aloha_7896 小时前
力扣hot100做题整理91-100
数据结构·算法·leetcode
Tiny番茄6 小时前
31.下一个排列
数据结构·python·算法·leetcode
挂科是不可能出现的6 小时前
最长连续序列
数据结构·c++·算法
前端小L7 小时前
动态规划的“数学之魂”:从DP推演到质因数分解——巧解「只有两个键的键盘」
算法·动态规划
RTC老炮7 小时前
webrtc弱网-ReceiveSideCongestionController类源码分析及算法原理
网络·算法·webrtc
21号 17 小时前
9.Redis 集群(重在理解)
数据库·redis·算法
hadage2339 小时前
--- 数据结构 AVL树 ---
数据结构·算法