首页 > 解决方案 > 带有内部while循环的while循环:O(n)还是O(n ^ 2)?

问题描述

#include <unordered_map>
using namespace std;

        int lengthOfLongestSubstring(string s) {
            
            unordered_map<char, int> ht;
            int max = 0;
            
            int i = 0; int j = 0; 
            while (i < s.size() && j < s.size()) {
                
                if (ht.find(s.at(j)) == ht.end()) {
                    ht.insert( {s.at(j), j} );
                    max = (j - i + 1 > max) ? j - i + 1 : max;
                    j++;
                }
                else {
                    int len = ht.at(s.at(j)) + 1;
                    while(i < len) {
                        ht.erase(s.at(i));
                        i++;
                    }
                    
                }
                
            }
            
            return max;
        }

是时间复杂度O(n)还是O(n^2)?为什么?

我的直觉是它是 O(n),i 和 j 迭代相同的长度。

标签: c++algorithmbig-o

解决方案


它的:

  • 严格来说:O(2n),在最坏的情况下,您迭代输入大小的两倍;
  • 用渐近语言说话: ,因为忽略了O(n)常数因素。

推荐阅读