• 剑指 Offer——和为 S 的两个数字


    1. 题目

    2. 解答

    由于数组是已经排好序的,我们可以定义两个指针,第一个指针指向第一个元素,第二个指针指向最后一个元素,然后求出这两个元素的和,与目标和进行比较。若小于目标和,第一个指针向前移动;若大于目标和,第二个指针向后移动。

    若等于目标和,题目中要求输出乘积最小的。由于两个元素的乘积肯定小于目标和的平方,因此我们初始化目标和的平方为一个最小乘积。当找到两个元素和等于目标和的时候,如果他们的乘积小于最小乘积,则更新最小乘积以及这两个元素的索引值,然后两个指针分别向前向后移动一步继续寻找。

    时间复杂度 (O(n)),空间复杂度 (O(1))

    class Solution {
    public:
        vector<int> FindNumbersWithSum(vector<int> array, int sum) {
            
            vector<int> result;
            int n = array.size();
            if (n < 2)    return result;
            int first = 0;
            int last = n-1;
            int target = 0;
            int index1 = 0;
            int index2 = 0;
            int flag = 0;
            long long min_product = sum * sum;
    
            while (first < last)
            {
                target = array[first] + array[last];
                if (target == sum)
                {
                    int product = array[first] * array[last];
                    if (product < min_product)
                    {
                        min_product = product;
                        index1 = first;
                        index2 = last;
                        flag = 1;
                    }
                    first++;
                    last--;
                }
                else if (target < sum)  first++;
                else    last--;
            }
            if (flag)
            {
                result.push_back(array[index1]);
                result.push_back(array[index2]);
            }
            
            return result;       
        }
    };
    

    获取更多精彩,请关注「seniusen」!

  • 相关阅读:
    监听器
    过滤器
    连接池与分页
    jdbc优化
    jdbc入门
    web开发mysql基础
    自定义标签
    jsp基础
    会话管理入门
    19. Remove Nth Node From End of List C++删除链表的倒数第N个节点
  • 原文地址:https://www.cnblogs.com/seniusen/p/10626780.html
Copyright © 2020-2023  润新知