如何写comparator 用class的方法记录,

401. Kth Smallest Number in Sorted Matrix

指针往斜下发展

  1. pair 是内部已经有的类,写到外面会混乱
  2. 用指针指向新建的class : Pair * temp
  3. 重新comparator的时候用一个新的名字 比如cmp 或者这里的comparators,否则会冲突
  4. 小于是升序,大于是降序
  5. 小顶堆 <

    1. class Solution {
    2. public:
    3. /**
    4. * @param matrix: a matrix of integers
    5. * @param k: An integer
    6. * @return: the kth smallest number in the matrix
    7. */
    8. class Pair {
    9. public:
    10. int column, row;
    11. int value;
    12. Pair(int row, int col, int val) {
    13. this->column = col;
    14. this->row = row;
    15. this->value = val;
    16. }
    17. };
    18. // xiaodingdui
    19. struct Comparators {
    20. bool operator()(const Pair *a, const Pair *b) {
    21. return a->value > b->value;
    22. }
    23. };
    24. vector <int> rows = { 0, 1 };
    25. vector <int> columns = { 1, 0 };
    26. int kthSmallest(vector<vector<int>> &matrix, int k) {
    27. // write your code here
    28. if (k > matrix.size() * matrix[0].size()) {
    29. return 0;
    30. }
    31. vector<vector<int>> visited(matrix.size(), vector<int>(matrix[0].size()));
    32. priority_queue <Pair*, vector<Pair*>, Comparators> pq;
    33. int num = 0;
    34. Pair *temp = new Pair(0, 0, matrix[0][0]);
    35. pq.push(temp);
    36. visited[0][0] = 1;
    37. for (int i = 0; i < matrix.size() * matrix[0].size(); i++) {
    38. if (num == k - 1) {
    39. return temp->value;
    40. }
    41. temp = pq.top();
    42. pq.pop();
    43. for (int j = 0; j < 2; j++) {
    44. int newCol = temp->column + columns[j];
    45. int newRow = temp->row + rows[j];
    46. if (newRow < matrix.size() && newCol < matrix[0].size()&& visited[newRow][newCol] == 0) {
    47. Pair *newPair = new Pair(newRow, newCol, matrix[newRow][newCol]);
    48. visited[newRow][newCol] = 1;
    49. pq.push(newPair);
    50. }
    51. }
    52. num++;
    53. }
    54. }
    55. };
class Solution {
public:
    /**
     * @param nums: an array of integers
     * @param s: An integer
     * @return: an integer representing the minimum size of subarray
     */
    int minimumSize(vector<int> &nums, int s) {
        int sumAll = 0;
        for (int i = 0; i < nums.size(); i ++){
            sumAll += nums[i];
        }
        if (sumAll < s){
            return -1;
        }
        // write your code here
        int first = 0, last = 0, sum = 0;
        int min = nums.size();
        for (first = 0; first < nums.size(); first ++){

            while(last < nums.size() && sum < s){
                sum += nums[last];
                last += 1;
            }
            if (sum >= s){
                if (last - first < min){
                    min = last - first; 
                }
                sum -= nums[first ];
                continue;
            }
        }
        return min;
    }
};

384. Longest Substring Without Repeating Characters

class Solution {
public:
    /**
     * @param s: a string
     * @return: an integer
     */
    int lengthOfLongestSubstring(string &s) {
        // write your code here
        int first = 0, last = 0, length = 0;
        vector <int> visited(256);
        for (first = 0; first < s.size(); first ++){
            while(last < s.size() && visited[s[last]] == 0){
                visited[s[last]] = 1;

                last ++;
                length = max(length, last - first);
            }

            visited [s[first]] = 0;
        }
        return length;
    }
};

386. Longest Substring with At Most K Distinct Characters

一直要执行到<

class Solution {
public:
    /**
     * @param s: A string
     * @param k: An integer
     * @return: An integer
     */
    int lengthOfLongestSubstringKDistinct(string &s, int k) {
        // write your code here
        int first, last;
        vector <int> visited(256);
        int diffChar, res;
        for (first = 0; first < s.size(); first ++){
            while (last != s.size() && diffChar <= k){
                if (visited[s[last]] == 0){
                    diffChar += 1;
                }
                visited[s[last]] += 1;
                last ++;
                if (last - first > res && diffChar <= k){
                    res = last - first;
                }
                // cout << diffChar << " diff"<< endl;
                // cout << first << " first" << last<< " last" <<"\n";
            }
            // if (last - first > res && diffChar <= k){
            //     res = last - first;
            // }
            visited[s[first]] -= 1;
            if(visited[s[first]] == 0){
                diffChar -= 1;
            }
        }
        return res;
    }
};

465. Kth Smallest Sum In Two Sorted Arrays

class Node{
public:
    int col, row;
    int value;
    Node(int row, int column, int rowVal, int colVal){
        this -> row = row;
        this -> col = column;
        this -> value = rowVal + colVal;
    }
};


class Solution {
public:
    /** 
     * @param A: an integer arrays sorted in ascending order
     * @param B: an integer arrays sorted in ascending order
     * @param k: An integer
     * @return: An integer
     */
    struct cmp{
        bool operator() (const Node *a, const Node *b){
            return a -> value > b -> value;
        }
    };
     vector <int> columns =  {1, 0};
     vector <int> rows = {0, 1};
    int kthSmallestSum(vector<int> &A, vector<int> &B, int k) {
        // write your code here
        vector<vector<int>> visited(A.size(), vector<int>(B.size()));
        priority_queue <Node*, vector<Node*>, cmp> pq;
        Node * newNode = new Node(0, 0, A[0], B[0]);
        pq.push(newNode);
        Node * temp;

        for (int i = 0; i < k; i ++){
            temp = pq.top();
            pq.pop();
            for(int j = 0; j < 2; j ++){
                int tempRow = temp -> row + rows[j];
                int tempCol = temp -> col + columns[j];
                if (tempRow < A.size() && tempCol < B.size() && visited[tempRow][tempCol] == 0){
                    //cout << "add " << tempRow << ' ' << tempCol << ' ' << i << endl;
                    Node * tempnewNode = new Node(tempRow, tempCol, A[tempRow], B[tempCol]);
                    pq.push(tempnewNode);
                    visited[tempRow][tempCol] = 1;
                }
                //cout << temp -> value << ' ' << i <<endl;
            }
        }
        return temp -> value;

    }
};

1070. Accounts Merge

class Solution {
private:
    vector <int> father;
    vector <string> findString;
    unordered_map <string, int> findPos;
    unordered_map <string, string> findName;
    int pos;

public:
    /**
    * @param accounts: List[List[str]]
    * @return: return a List[List[str]]
    */
    int find(int x) {
        if (father[x] == x) {
            return x;
        }
        return father[x] = find(father[x]);
    }
    void connect(int x, int y) {
        int a = find(x);
        int b = find(y);
        if (a != b) {
            father[a] = b;
        }
    }


    vector<vector<string>> accountsMerge(vector<vector<string>> &accounts) {
        // write your code here
        vector<vector<string>> res;
        unordered_map <int, int> visited;
        int temp = 0;

        for (int i = 0; i < accounts.size(); i++) {
            for (int j = 1; j < accounts[i].size(); j++) {
                if (!findPos.count(accounts[i][j])) {
                    findString.push_back(accounts[i][j]);
                    father.push_back(pos);
                    findPos[accounts[i][j]] = pos;
                    findName[accounts[i][j]] = accounts[i][0];
                    pos += 1;
                }
                connect(findPos[accounts[i][j]], findPos[accounts[i][1]]);
            }
        }

        for (int i = 0; i < father.size(); i++) {
            if (visited.count(find(i))) {
                res[visited[find(i)]].push_back(findString[i]);
            }
            else {
                res.push_back(vector <string> {findName[findString[i]], findString[i]});
                visited[find(i)] = temp;
                temp++;
            }
        }
        for (int i = 0; i < res.size(); i++) {
            sort(res[i].begin() + 1, res[i].end());
        }
        return res;

    }
};

406. Minimum Size Subarray Sum(指针指向区间)

class Solution {
public:
    /**
     * @param nums: an array of integers
     * @param s: An integer
     * @return: an integer representing the minimum size of subarray
     */
    int minimumSize(vector<int> &nums, int s) {
        // write your code here
        int start = 0, end = 0, length = 1;
        int res = INT_MAX, sum = 0;
        while (end != nums.size()){
            sum += nums[end];
            while (sum >= s){
                if (length < res){
                    res = length;
                }
                sum -= nums[start];
                start += 1;
                length --;
            }
            end++;
            length ++;
        }
        if (res == INT_MAX){
            return -1;
        }
        return res;
    }
};