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

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

611. 有效三角形的个数

611. 有效三角形的个数icon-default.png?t=N6B9https://leetcode.cn/problems/valid-triangle-number/

题目描述:

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

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

解题思路:

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

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

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

当我们将sort排序一下,这样的话假设ac是否成立!

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

解题代码:

class Solution {
public:
    int triangleNumber(vector& nums) {
        sort(nums.begin(),nums.end());
        //假设a=2;i--)
        {
            int left=0;
            int right=i-1;
            while(leftnums[i])
                {
                    num+=(right-left);
                    right--;
                }
                else
                {
                    left++;
                }
            }
        }
        return num;
    }
};

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

剑指 Offer 57. 和为s的两个数字icon-default.png?t=N6B9https://leetcode.cn/problems/he-wei-sde-liang-ge-shu-zi-lcof/

题目描述:

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

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

解题思路: 

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

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

我们假设sub=right-left

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

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

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

解题代码:

class Solution {
public:
    vector twoSum(vector& nums, int target) {
        int n=nums.size();
        int left=0;
        int right=n-1;
        while(nums[right]>target)
        {
            right--;
        }
        while(leftnums[left])
            {
                left++;
            }
            else//sub

 

 

你可能感兴趣的:(算法挨揍日记,Leetcode,算法,职场和发展)