[C++] vector<int> vs. int[]

背景

vector<int>是可以改变大小的。
int a[100]是指定大小为100的, 而且必须的声明的时候给出大小。
今天, 做了阿里周赛的第一题, 一直超时,赛后才知道是这个原因。写了个简单的对比代码, 计算了时间, 在知道数据范围的时候, int []来初始化, 能提高效率。
有兴趣的话, 可以自己试一下。

题目

描述
给出一个只含有小写字母的字符串的集合以及一个目标串(target),输出所有可以经过不多于 k 次操作得到目标字符串的字符串。

你可以对字符串进行一下的3种操作:

  • 加入1个字母

  • 删除1个字母

  • 替换1个字母

0 < = < = 60 0<=<=60 0<=<=60
s u m ( l e n ( s ) ) < = 2 e 5 sum(len(s)) <= 2e5 sum(len(s))<=2e5
l e n ( t a r g e t ) < = 1000 len(target) <= 1000 len(target)<=1000
s u m ( l e n ( s ) ) ∗ l e n ( t a r g e t ) < = 2 e 7 sum(len(s)) * len(target) <=2e7 sum(len(s))len(target)<=2e7

示例
样例 1:

给出字符串 ["abc","abd","abcd","adc"],目标字符串为 "ac" ,k = 1
返回 ["abc","adc"]
输入:

["abc", "abd", "abcd", "adc"]
"ac"
1

输出:

["abc","adc"]

解释:
“abc” 去掉 “b”
“adc” 去掉 “d”

样例 2:

输入:

["acc","abcd","ade","abbcd"]
"abc"
2

输出:

["acc","abcd","ade","abbcd"]

解释:

"acc""c" 变成 "b"
"abcd" 去掉 "d"
"ade""d" 变成 "b""e" 变成 "c"
"abbcd" 去掉 "b""d"

Note

  1. 对编辑距离不熟悉的,可以参考 LeetCode 72. 编辑距离

超时代码

class Solution {
public:
    int minDistance(string word1, string word2) {
    	// Use Vector<int>
        vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0));

        for (int i = 0; i < dp.size(); i++) {
            dp[i][0] = i;
        }
        for (int j = 0; j < dp[0].size(); j++) {
            dp[0][j] = j;
        }

        for (int i = 1; i < dp.size(); i++) {
            for (int j = 1; j < dp[i].size(); j++) {
                
                    dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])) + 1;
                if (word1[i - 1] == word2[j - 1]) 
                    dp[i][j] = min(dp[i][j], dp[i - 1][j - 1]);
            }
        }
        return dp.back().back();
    }
    vector<string> kDistance(vector<string> &words, string &target, int k) {
        // write your code here
        vector<string> ans;
        for(auto w:words){
            if(minDistance(w, target) <= k) ans.push_back(w);
        }
        return ans;
    }
};

AC代码

class Solution {
public:
    int minDistance(string word1, string word2) {
        int n1 = word1.size();
        int n2 = word2.size();
        if(n1 == 0 || n2 == 0) return max(n1, n2);
        int dp[n1+1][n2+1];

        for (int i = 0; i <= n1; i++) {
            dp[i][0] = i;
        }
        for (int j = 0; j <= n2; j++) {
            dp[0][j] = j;
        }

        for (int i = 1; i <= n1; i++) {
            for (int j = 1; j <= n2; j++) {
                dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])) + 1;
                if (word1[i - 1] == word2[j - 1]) 
                    dp[i][j] = min(dp[i][j], dp[i - 1][j - 1]);
            }
        }
        return dp[n1][n2];
    }
    vector<string> kDistance(vector<string> &words, string &target, int k) {
        // write your code here
        vector<string> ans;
        for(auto w:words){
            if(minDistance(w, target) <= k) ans.push_back(w);
        }
        return ans;
    }
};

性能实验代码

#include <time.h>
#include <stdio.h>
#include <vector>
#include <stdlib.h>
#include <iostream>
using namespace std;
int main(){
    int maxn = 1000000;
    clock_t start, finish;
    double duration;
    start = clock();
    int a[maxn];
    for(int i= 0; i < maxn; i ++) a[i] = i;
    finish = clock();
    duration = (double)(finish - start) / CLOCKS_PER_SEC; 
    cout << duration << endl;
    start = clock();
    vector<int> v;
    for(int i = 0; i < maxn; i++) v.push_back(i);
    finish = clock();
    duration = (double)(finish - start) / CLOCKS_PER_SEC; 
    cout << duration << endl;

    return 0;
}

实验结果

(base) LilideAir:CPP_basic lilisun$ ./a.out 
0.008184
0.033609
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值