1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| class SparseVector { public:
SparseVector(vector<int> &nums) { for (int i = 0; i < nums.size(); ++i) { if (nums[i]) { v.emplace_back(i, nums[i]); } } }
int getIdx(int i) { return v[i].first; }
int getNum(int i) { return v[i].second; }
int getDim() { return v.size(); }
int lower_bound(int b, int e, int idx) { return std::lower_bound(begin(v) + b, begin(v) + e, make_pair(idx, INT_MIN)) - begin(v); }
int dotProduct(SparseVector& vec) { int res = 0; for (int i = 0, j = 0, m = getDim(), n = vec.getDim(); i < m && j < n;) { int ii = getIdx(i), ij = vec.getIdx(j); if (ii == ij) { res += getNum(i++) * vec.getNum(j++); } else if (ii < ij) { i = lower_bound(i + 1, m, ij); } else { j = vec.lower_bound(j + 1, n, ii); } } return res; }
vector<pair<int, int>> v; };
|