如何解决C ++`for`在它应为多个时仅循环迭代一次
我正在尝试使用C ++进行蛮力解决,以解决LeetCode显然最受欢迎的问题“两次加总”问题,如本视频https://youtu.be/KLlXCFG5TnA?t=32中0:32所述。本质上,我需要遍历向量中2位和的每种可能组合,直到达到所需的目标数字。然后,我返回数字的2个索引,其值组合起来等于目标数字。
我的代码适用于LeetCode提出的前17个测试用例。但是对于下面的测试用例,尽管迭代器从未达到各自的限制(for
和nums.size()-2
),nums.size()-1
循环仅迭代一次。
我缓慢地通过调试器,但是对于为什么代码“ {early”早于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;
}
解决方法
向量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++) {
在将空向量传递给函数时可以调用未定义的行为,因为在这种情况下,i
由于通常的算术转换而总是小于nums.size() - 2
或nums.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,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 )
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。