【问题标题】:My code is showing wrong output for a test case of leetcode [closed]我的代码显示 leetcode 测试用例的错误输出 [关闭]
【发布时间】:2022-01-09 14:34:05
【问题描述】:

问题:- https://leetcode.com/problems/intersection-of-two-arrays/

这是我的代码:-

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        vector <int> result;
        for(int i=0;i<nums1.size(); i++){
            for(int j=0;j<nums2.size();j++){
                if(nums1[i] == nums2[j]){
                    result.push_back(nums1[i]);
                    break;
                }   
            }
        }
        for(int i=0;i<result.size();i++){
            for(int j=0;j<result.size();j++){
                if(result[i] == result[j] and i!=j){
                    result.pop_back();
                }
            }
        }
        return result;
    }
};

我得到了这个测试用例的错误输出:- 输入:-

nums1 = [61,24,20,58,95,53,17,32,45,85,70,20,83,62,35,89,5,95,12,86,58,77,30,64,46,13,5,92,67,40,20,38,31,18,89,85,7,30,67,34,62,35,47,98,3,41,53,26,66,40,54,44,57,46,70,60,4,63,82,42,65,59,17,98,29,72,1,96,82,66,98,6,92,31,43,81,88,60,10,55,66,82,0,79,11,81]

nums2 =[5,25,4,39,57,49,93,79,7,8,49,89,2,7,73,88,45,15,34,92,84,38,85,34,16,6,99,0,2,36,68,52,73,50,77,44,61,48]

预期输出:-

[61,45,85,89,5,77,92,38,7,34,44,57,4,6,88,0,79]

我的输出:-

[61,45,85,89,5,77,5,92,38,89,85,7,34,44,57] 

请告诉我哪里错了

【问题讨论】:

  • 请在不依赖外部链接的情况下提供minimal reproducible example。代码应该做什么?
  • 为什么是一个类?为什么看起来像 c# 代码?
  • 不管怎样,问题是这个result.pop_back();pop_back() 弹出最后一个元素。你应该使用erase() 之类的东西。参考-cplusplus.com/reference/vector/vector/erase
  • @AbdurRakib 因为这就是在 leetcode 上制定解决方案的方式?
  • 此外,请注意您的算法效率不高:O(n^2)。例如,您可以先对两个数组进行排序。或使用std::set。使用std::set_intersection 也可能有用。

标签: c++ c++11 vector


【解决方案1】:

问题出在第二个循环中。您尝试消除双重元素,以获得独特的结果。

但是,在找到重复项后,您不会删除重复项,而是使用pop_back 删除与重复项无关的vector 的最后一个元素。这一点,你需要纠正。但是,请注意,您的循环将不再起作用。

所以,最好是使用不同的方法。您可以为此使用函数std::set_intersection。此处必须在开头对输入向量进行排序。

还有std::unique可用,也需要排序。

您可以将结果元素添加到只能保存唯一值的容器中。像 std::unordered_set 一样,然后稍后将结果复制回向量。

set_intersetction 的 Eaxmaple:

int main() {
    std::vector<int> nums1{ 61,24,20,58,95,53,17,32,45,85,70,20,83,62,35,89,5,95,12,86,58,77,30,64,46,13,5,92,67,40,20,38,31,18,89,85,7,30,67,34,62,35,47,98,3,41,53,26,66,40,54,44,57,46,70,60,4,63,82,42,65,59,17,98,29,72,1,96,82,66,98,6,92,31,43,81,88,60,10,55,66,82,0,79,11,81 };
    std::vector<int> nums2{ 5,25,4,39,57,49,93,79,7,8,49,89,2,7,73,88,45,15,34,92,84,38,85,34,16,6,99,0,2,36,68,52,73,50,77,44,61,48 };
    
    std::sort(nums1.begin(), nums1.end());
    std::sort(nums2.begin(), nums2.end());
    std::vector<int> v_intersection;

    std::set_intersection(nums1.begin(), nums1.end(),nums2.begin(), nums2.end(), std::back_inserter(v_intersection));
    for (int n : v_intersection)
        std::cout << n << ' ';
}

std::unordered_set 的示例:

#include <iostream>
#include <vector>
#include <unordered_set>


class Solution {
public:
    std::vector<int> intersection(std::vector<int>& nums1, std::vector<int>& nums2) {
        std::unordered_set<int> result{};
        for (int i = 0; i < nums1.size(); i++) {
            for (int j = 0; j < nums2.size(); j++) {
                if (nums1[i] == nums2[j]) {
                    result.insert(nums1[i]);
                    break;
                }
            }
        }
        return { result.begin(),result.end() };
    }
};
int main() {
    std::vector nums1{ 61,24,20,58,95,53,17,32,45,85,70,20,83,62,35,89,5,95,12,86,58,77,30,64,46,13,5,92,67,40,20,38,31,18,89,85,7,30,67,34,62,35,47,98,3,41,53,26,66,40,54,44,57,46,70,60,4,63,82,42,65,59,17,98,29,72,1,96,82,66,98,6,92,31,43,81,88,60,10,55,66,82,0,79,11,81 };
    std::vector nums2{ 5,25,4,39,57,49,93,79,7,8,49,89,2,7,73,88,45,15,34,92,84,38,85,34,16,6,99,0,2,36,68,52,73,50,77,44,61,48 };

    std::vector result = Solution().intersection(nums1,nums2);
    
    for (const int n : result)
        std::cout << n << ' ';
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多