Find longest increasing sequence

前端 未结 7 1229
感情败类
感情败类 2020-12-12 11:49

You are given a sequence of numbers and you need to find a longest increasing subsequence from the given input(not necessary continuous).

I found the link to this(Lo

相关标签:
7条回答
  • 2020-12-12 12:49

    Based on @fgb 's answer, I implemented the algorithm using c++ to find the longest strictly increasing sub-sequence. Hope this will be somewhat helpful.

    M[i] is the index of the last element of the sequence whose length is i, P[i] is the index of the previous element of i in the sequence, which is used to print the whole sequence.

    main() is used to run the simple test case: {0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15}.

    #include <vector>
    using std::vector;
    int LIS(const vector<int> &v) {
      int size = v.size(), max_len = 1;
      // M[i] is the index of the last element of the sequence whose length is i
      int *M = new int[size];
      // P[i] is the index of the previous element of i in the sequence, which is used to print the whole sequence
      int *P = new int[size];
      M[0] = 0; P[0] = -1;
      for (int i = 1; i < size; ++i) {
        if (v[i] > v[M[max_len - 1]]) {
          M[max_len] = i;
          P[i] = M[max_len - 1];
          ++max_len;
          continue;
        }
        // Find the position to insert i using binary search
        int lo = 0, hi = max_len - 1;
        while (lo <= hi) {
          int mid = lo + ((hi - lo) >> 1);
          if (v[i] < v[M[mid]]) {
            hi = mid - 1;
          } else if (v[i] > v[M[mid]]) {
            lo = mid + 1;
          } else {
            lo = mid;
            break;
          }
        }
        P[i] = P[M[lo]];  // Modify the previous pointer
        M[lo] = i;  
      }
      // Print the whole subsequence
      int i = M[max_len - 1];
      while (i >= 0) {
        printf("%d ", v[i]);
        i = P[i];
      }
      printf("\n");
      delete[] M, delete[] P;
      return max_len;
    }
    int main(int argc, char* argv[]) {
      int data[] = {0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15};
      vector<int> v;
      v.insert(v.end(), data, data + sizeof(data) / sizeof(int));
      LIS(v);
      return 0;
    }
    
    0 讨论(0)
提交回复
热议问题