Closed. This question is not reproducible or was caused by typos。它当前不接受答案。












想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。

在4个月前关闭。



Improve this question




我正在尝试使用C++进行蛮力解决,以解决LeetCode显然最受欢迎的问题“两次加总”问题,如本视频0:32标记中所述:https://youtu.be/KLlXCFG5TnA?t=32。本质上,我需要遍历 vector 中2位数字和的每种可能组合,直到达到所需的目标数字。然后,我返回数字的2个索引,其值组合起来等于目标数字。
我的代码适用于LeetCode提出的前17个测试用例。但是对于下面的测试用例,尽管迭代器从未达到各自的限制(fornums.size()-2),但nums.size()-1循环仅迭代一次。
我缓慢地通过调试器,但是对于为什么代码“早”脱离for循环感到迷惑。
Solution.h
#include <vector>
#include <iostream>

using namespace std;

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> result_vector;
        for (int i = 0; i < nums.size() - 2; i++) { // this for loop [undesirably] only iterates once
            for (int j = i + 1; j < nums.size() - 1; j++) { // this for loop also [undesirably] only iterates once
                if (nums.at(i) + nums.at(j) == target) {
                    result_vector.push_back(i);
                    result_vector.push_back(j);
                }
            }
        }
        if (result_vector.size() == 0) {
            result_vector.push_back(-1);
            result_vector.push_back(-1);
            cout << "No solution found.";
        }
        return result_vector;
    }
};
Main.cpp
#include "Solution.h"

int main()
{
    Solution sol;

    vector<int> vect{3, 2, 4};
    int target = 6;

    sol.twoSum(vect, target);

    return 0;
}

最佳答案

vector vect作为参数传递给函数

vector<int> vect{3, 2, 4};
有三个要素。
因此在函数内部,外循环
for (int i = 0; i < nums.size() - 2; i++) {
由于条件而只有一次迭代
i < nums.size() - 2
相当于
i < 3 - 2
注意不要将int类型用作索引类型。否则这个循环
for (int i = 0; i < nums.size() - 2; i++) {
可以在将空 vector 传递给函数时调用未定义的行为,因为在这种情况下,由于通常的算术转换,因此i总是小于nums.size() - 2nums.size() - 1
例如,您的程序可以通过以下方式查找。
#include <iostream>
#include <vector>
#include <utility>

struct Solution
{
    typedef std::vector<int>::size_type size_type;

    std::vector<std::pair<size_type, size_type>>
    operator ()( const std::vector<int> &v, int target )
    {
        std::vector<std::pair<size_type, size_type>> result;


        for ( size_type i = 1; i < v.size(); i++ )
        {
            for ( size_type j = i; j < v.size(); j++ )
            {
                if ( v[j] + v[i-1] == target )
                {
                    result.push_back( { i - 1, j } );
                }
            }
        }

        return result;
    }
};

int main()
{
    std::vector<int> v = { 3, 2, 4 };
    int target = 6;

    auto result = Solution()( v, target );

    for ( const auto &p : result )
    {
        std::cout << "( " << p.first << ", " << p.second << " ) ";
    }

    std::cout << '\n';

    return 0;
}
程序输出为
( 1, 2 )

07-24 19:19
查看更多