Top100(中)
二叉树
| int *res; |
| |
| void inorder(struct TreeNode *root, int *returnSize) { |
| if (root == NULL) return; |
| |
| inorder(root->left, returnSize); |
| res[(*returnSize)++] = root->val; |
| inorder(root->right, returnSize); |
| } |
| |
| int *inorderTraversal(struct TreeNode *root, int *returnSize) { |
| res = (int *) malloc(sizeof(int) * 100); |
| *returnSize = 0; |
| inorder(root, returnSize); |
| return res; |
| } |
| int *inorderTraversal(struct TreeNode *root, int *returnSize) { |
| int *res = (int *) malloc(sizeof(int) * 100); |
| *returnSize = 0; |
| struct TreeNode *stack[100]; |
| int top = 0; |
| |
| while (top != 0 || root != NULL) { |
| |
| while (root != NULL) { |
| stack[top++] = root; |
| root = root->left; |
| } |
| |
| root = stack[--top]; |
| |
| res[(*returnSize)++] = root->val; |
| root = root->right; |
| } |
| |
| return res; |
| } |
| int *res; |
| |
| void inorderMorris(struct TreeNode *root, int *returnSize) { |
| if (root == NULL) return; |
| struct TreeNode *cur = root; |
| while (cur != NULL) { |
| if (cur->left != NULL) { |
| struct TreeNode *rightMost = cur->left; |
| while (rightMost->right != NULL && rightMost->right != cur) { |
| rightMost = rightMost->right; |
| } |
| if (rightMost->right == NULL) { |
| rightMost->right = cur; |
| cur = cur->left; |
| } else { |
| |
| res[(*returnSize)++] = cur->val; |
| rightMost->right = NULL; |
| cur = cur->right; |
| } |
| } else { |
| |
| res[(*returnSize)++] = cur->val; |
| cur = cur->right; |
| } |
| } |
| } |
| |
| int *inorderTraversal(struct TreeNode *root, int *returnSize) { |
| res = (int *) malloc(sizeof(int) * 100); |
| *returnSize = 0; |
| if (root == NULL) return res; |
| inorderMorris(root, returnSize); |
| return res; |
| } |
| |
| int maxDepth(struct TreeNode* root) { |
| if (root == NULL) return 0; |
| int left = maxDepth(root->left); |
| int right = maxDepth(root->right); |
| return (left > right ? left : right) + 1; |
| } |
| |
| int maxDepth(struct TreeNode *root) { |
| if (root == NULL) return 0; |
| int depth = 0; |
| const int size = 5002; |
| |
| struct TreeNode *queue[size]; |
| int front = 0, rear = 0; |
| queue[rear++] = root; |
| |
| while (front != rear) { |
| int count = (rear - front + size) % size; |
| |
| depth++; |
| while (count-- > 0) { |
| struct TreeNode *node = queue[(front++) % size]; |
| if (node->left != NULL) queue[(rear++) % size] = node->left; |
| if (node->right != NULL) queue[(rear++) % size] = node->right; |
| } |
| } |
| return depth; |
| } |
| struct TreeNode *invertTree(struct TreeNode *root) { |
| if (root == NULL) return root; |
| |
| struct TreeNode *left = invertTree(root->right); |
| struct TreeNode *right = invertTree(root->left); |
| root->left = left; |
| root->right = right; |
| return root; |
| } |
| |
| bool dfs(struct TreeNode *L, struct TreeNode *R) { |
| if (L == NULL && R == NULL) return true; |
| if (L == NULL || R == NULL || L->val != R->val) return false; |
| return dfs(L->left, R->right) && dfs(L->right, R->left); |
| } |
| |
| bool isSymmetric(struct TreeNode *root) { |
| if (root == NULL) return true; |
| return dfs(root->left, root->right); |
| } |
| |
| bool isSymmetric(struct TreeNode *root) { |
| if (root == NULL) return true; |
| if (root->left == NULL && root->right == NULL) return true; |
| if (root->left == NULL || root->right == NULL || root->left->val != root->right->val) return false; |
| |
| const int size = 1001; |
| struct TreeNode *queue[size]; |
| int front = 0, rear = 0; |
| |
| queue[rear++] = root->left; |
| queue[rear++] = root->right; |
| |
| while (rear != front) { |
| struct TreeNode *L = queue[(front++) % size]; |
| struct TreeNode *R = queue[(front++) % size]; |
| if (L == NULL && R == NULL) return true; |
| if ((L == NULL || R == NULL) |
| || (L->val != R->val) |
| || (L->left == NULL && R->right != NULL) |
| || (L->right == NULL && R->left != NULL) |
| || (L->right == NULL && R->left != NULL) |
| || (L->left == NULL && R->right != NULL)) |
| return false; |
| if (L->left != NULL) { |
| queue[(rear++) % size] = L->left; |
| queue[(rear++) % size] = R->right; |
| } |
| if (L->right != NULL) { |
| queue[(rear++) % size] = L->right; |
| queue[(rear++) % size] = R->left; |
| } |
| } |
| return true; |
| } |
| int res; |
| |
| int height(struct TreeNode *root) { |
| if (root == NULL)return 0; |
| int left = height(root->left); |
| int right = height(root->right); |
| if (left + right > res) res = left + right; |
| return (left > right ? left : right) + 1; |
| } |
| |
| int diameterOfBinaryTree(struct TreeNode *root) { |
| res = 0; |
| height(root); |
| return res; |
| } |
| int **levelOrder(struct TreeNode *root, int *returnSize, int **returnColumnSizes) { |
| |
| const int size = 1002; |
| |
| const int leverMax = 2000; |
| |
| |
| int **res = (int **) malloc(sizeof(int *) * leverMax); |
| |
| *returnSize = 0; |
| |
| *returnColumnSizes = (int *) malloc(sizeof(int) * leverMax); |
| if (root == NULL) return res; |
| |
| |
| |
| struct TreeNode *queue[size]; |
| int lever = 0; |
| |
| int *columnSize = (int *) calloc(leverMax, sizeof(int)); |
| int front = 0, rear = 0; |
| queue[rear++] = root; |
| |
| while (front != rear) { |
| |
| int count = (rear - front + size) % size; |
| res[lever] = (int *) malloc(sizeof(int) * count); |
| int temp = 0; |
| while (count-- > 0) { |
| root = queue[(front++) % size]; |
| |
| res[lever][temp++] = root->val; |
| |
| columnSize[lever]++; |
| if (root->left != NULL) queue[(rear++) % size] = root->left; |
| if (root->right != NULL) queue[(rear++) % size] = root->right; |
| } |
| |
| lever++; |
| } |
| |
| *returnSize = lever; |
| for (int i = 0; i < lever; ++i) |
| (*returnColumnSizes)[i] = columnSize[i]; |
| return res; |
| } |
| |
| struct TreeNode *generate(int *nums, int left, int right) { |
| if (left > right) return NULL; |
| |
| int mid = (right - left) / 2 + left; |
| |
| struct TreeNode *node = (struct TreeNode *) malloc(sizeof(struct TreeNode)); |
| node->val = nums[mid]; |
| node->left = generate(nums, left, mid - 1); |
| node->right = generate(nums, mid + 1, right); |
| return node; |
| } |
| |
| bool inorder(struct TreeNode *root) { |
| if (root == NULL) return true; |
| |
| if (!inorder(root->left)) return false; |
| |
| if (pre != NULL && pre->val >= root->val) return false; |
| pre = root; |
| |
| return inorder(root->right); |
| } |
| |
| bool isValidBST(struct TreeNode *root) { |
| pre = NULL; |
| return inorder(root); |
| } |
| |
| bool dfs(struct TreeNode *root, long long min, long long max) { |
| if (root == NULL) return true; |
| if (root->val <= min || root->val >= max)return false; |
| return dfs(root->left, min, root->val) && dfs(root->right, root->val, max); |
| } |
| |
| bool isValidBST(struct TreeNode *root) { |
| return dfs(root, 0x8000000000000000, 0x7fffffffffffffff); |
| } |
| int res; |
| int count; |
| |
| |
| |
| void inorder(struct TreeNode *root) { |
| if (root == NULL || res != -1) return; |
| inorder(root->left); |
| count--; |
| if (count == 0) { |
| res = root->val; |
| return; |
| } |
| inorder(root->right); |
| } |
| |
| int kthSmallest(struct TreeNode *root, int k) { |
| res = -1; |
| count = k; |
| inorder(root); |
| return res; |
| } |
| int *rightSideView(struct TreeNode *root, int *returnSize) { |
| *returnSize = 0; |
| if (root == NULL) return NULL; |
| int *res = (int *) malloc(sizeof(int) * 100); |
| |
| const int size = 52; |
| struct TreeNode **queue = (struct TreeNode **) malloc(sizeof(struct TreeNode *) * size); |
| int front = 0, rear = 0; |
| queue[rear++] = root; |
| |
| |
| while (rear != front) { |
| int count = (rear - front + size) % size; |
| struct TreeNode *node; |
| while (count-- > 0) { |
| node = queue[(front++) % size]; |
| if (node->left != NULL) queue[(rear++) % size] = node->left; |
| if (node->right != NULL) queue[(rear++) % size] = node->right; |
| } |
| res[(*returnSize)++] = node->val; |
| } |
| |
| return res; |
| } |
| int *res; |
| int size; |
| |
| void dfs(struct TreeNode *root, int depth, int *returnSize) { |
| if (root == NULL) return; |
| |
| if (depth == size) { |
| |
| |
| res[(*returnSize)++] = root->val; |
| size++; |
| } |
| |
| dfs(root->right, depth + 1, returnSize); |
| |
| dfs(root->left, depth + 1, returnSize); |
| } |
| |
| int *rightSideView(struct TreeNode *root, int *returnSize) { |
| *returnSize = 0; |
| if (root == NULL) return NULL; |
| res = (int *) malloc(sizeof(int) * 100); |
| size = 0; |
| dfs(root, 0, returnSize); |
| return res; |
| } |
| |
| void flatten(struct TreeNode *root) { |
| if (root == NULL) return; |
| struct TreeNode *stack[2000]; |
| int top = 0; |
| struct TreeNode *temp, *pre = NULL; |
| stack[top++] = root; |
| |
| while (top != 0) { |
| root = stack[--top]; |
| temp = root; |
| |
| if (root->right != NULL) stack[top++] = root->right; |
| if (root->left != NULL) stack[top++] = root->left; |
| |
| temp->left = NULL; |
| if (pre != NULL) pre->right = temp; |
| pre = temp; |
| } |
| } |
| |
| |
| void flatten(struct TreeNode *root) { |
| while (root != NULL) { |
| if (root->left != NULL) { |
| struct TreeNode *rightMost = root->left; |
| while (rightMost->right != NULL) |
| rightMost = rightMost->right; |
| |
| rightMost->right = root->right; |
| |
| |
| root->right = root->left; |
| root->left = NULL; |
| } |
| root = root->right; |
| } |
| } |
| struct TreeNode *pre; |
| |
| |
| void dfs(struct TreeNode *root) { |
| if (root == NULL) return; |
| dfs(root->right); |
| dfs(root->left); |
| root->left = NULL; |
| root->right = pre; |
| pre = root; |
| } |
| |
| void flatten(struct TreeNode *root) { |
| pre = NULL; |
| dfs(root); |
| } |
| |
| void flatten(struct TreeNode *root) { |
| if (root == NULL) return; |
| struct TreeNode *stack[2000]; |
| int top = 0; |
| struct TreeNode *pre = NULL; |
| |
| while (top != 0 || root != NULL) { |
| while (root != NULL) { |
| stack[top++] = root; |
| root = root->right; |
| } |
| |
| root = stack[--top]; |
| if (root->left != NULL && pre != root->left) { |
| |
| stack[top++] = root; |
| root = root->left; |
| } else { |
| |
| root->left = NULL; |
| root->right = pre; |
| pre = root; |
| root = NULL; |
| } |
| } |
| } |
| |
| struct TreeNode *generate(int *preorder, int start, int preorderSize, int *inorder, int left, int right) { |
| if (start > preorderSize || left > right) return NULL; |
| struct TreeNode *root = (struct TreeNode *) malloc(sizeof(struct TreeNode)); |
| |
| root->val = preorder[start]; |
| |
| |
| |
| int pos = left; |
| for (int i = left; i <= right; ++i) { |
| if (inorder[i] == preorder[start]) { |
| pos = i; |
| break; |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| int leftCount = pos - left; |
| |
| root->left = generate(preorder, start + 1, preorderSize, inorder, left, pos - 1); |
| |
| |
| root->right = generate(preorder, start + 1 + leftCount, preorderSize, inorder, pos + 1, right); |
| return root; |
| } |
| |
| struct TreeNode *buildTree(int *preorder, int preorderSize, int *inorder, int inorderSize) { |
| return generate(preorder, 0, preorderSize, inorder, 0, inorderSize - 1); |
| } |
| |
| int pre; |
| int in; |
| |
| struct TreeNode *generate(int *preorder, int preorderSize, int *inorder, int inorderSize, int stop) { |
| if (pre == preorderSize) return NULL; |
| if (inorder[in] == stop) { |
| in++; |
| return NULL; |
| } |
| int rootVal = preorder[pre++]; |
| struct TreeNode *root = (struct TreeNode *) malloc(sizeof(struct TreeNode)); |
| root->val = rootVal; |
| root->left = generate(preorder, preorderSize, inorder, inorderSize, rootVal); |
| root->right = generate(preorder, preorderSize, inorder, inorderSize, stop); |
| return root; |
| } |
| |
| struct TreeNode *buildTree(int *preorder, int preorderSize, int *inorder, int inorderSize) { |
| pre = 0; |
| in = 0; |
| return generate(preorder, preorderSize, inorder, inorderSize, 0x7fffffff); |
| } |
| |
| struct TreeNode *buildTree(int *preorder, int preorderSize, int *inorder, int inorderSize) { |
| if (preorderSize == 0) return NULL; |
| struct TreeNode **stack = (struct TreeNode **) malloc(sizeof(struct TreeNode *) * 3000); |
| int top = 0; |
| |
| int pre = 0; |
| int in = 0; |
| |
| |
| struct TreeNode *curRoot = (struct TreeNode *) malloc(sizeof(struct TreeNode)); |
| curRoot->val = preorder[pre++]; |
| curRoot->left = NULL; |
| curRoot->right = NULL; |
| stack[top++] = curRoot; |
| |
| struct TreeNode *root = curRoot; |
| |
| |
| while (pre < preorderSize) { |
| |
| if (curRoot->val == inorder[in]) { |
| |
| while (top != 0 && stack[top - 1]->val == inorder[in]) { |
| curRoot = stack[--top]; |
| in++; |
| } |
| |
| struct TreeNode *node = (struct TreeNode *) malloc(sizeof(struct TreeNode)); |
| node->val = preorder[pre++]; |
| node->left = NULL; |
| node->right = NULL; |
| curRoot->right = node; |
| curRoot = curRoot->right; |
| stack[top++] = curRoot; |
| } else { |
| |
| struct TreeNode *node = (struct TreeNode *) malloc(sizeof(struct TreeNode)); |
| node->val = preorder[pre++]; |
| node->left = NULL; |
| node->right = NULL; |
| curRoot->left = node; |
| curRoot = curRoot->left; |
| stack[top++] = curRoot; |
| } |
| } |
| return root; |
| } |
| |
| int dfsCount(struct TreeNode *root, int targetSum, long long tempSum) { |
| if (root == NULL) return 0; |
| int tempRes = 0; |
| tempSum += root->val; |
| if (tempSum == targetSum) tempRes++; |
| tempRes += dfsCount(root->left, targetSum, tempSum); |
| tempRes += dfsCount(root->right, targetSum, tempSum); |
| return tempRes; |
| } |
| |
| |
| int dfs(struct TreeNode *root, long long targetSum) { |
| if (root == NULL) return 0; |
| return dfsCount(root, targetSum, 0) + dfs(root->left, targetSum) + dfs(root->right, targetSum); |
| } |
| |
| |
| int pathSum(struct TreeNode *root, int targetSum) { |
| return dfs(root, targetSum); |
| } |
| |
| class Solution { |
| int dfsCount(TreeNode root, int targetSum, long tempSum) { |
| if (root == null) return 0; |
| int tempRes = 0; |
| tempSum += root.val; |
| if (tempSum == targetSum) tempRes++; |
| tempRes += dfsCount(root.left, targetSum, tempSum); |
| tempRes += dfsCount(root.right, targetSum, tempSum); |
| return tempRes; |
| } |
| |
| int dfs(TreeNode root, int targetSum) { |
| if (root == null) return 0; |
| return dfsCount(root, targetSum, 0) + dfs(root.left, targetSum) + dfs(root.right, targetSum); |
| } |
| |
| public int pathSum(TreeNode root, int targetSum) { |
| return dfs(root, targetSum); |
| } |
| } |
| |
| class Solution { |
| |
| Map<Long, Integer> hashMap = new HashMap<Long, Integer>(); |
| |
| public int pathSum(TreeNode root, int targetSum) { |
| |
| hashMap.put(0L, 1); |
| return dfs(root, 0, targetSum); |
| } |
| |
| public int dfs(TreeNode root, long prefixSum, int targetSum) { |
| if (root == null) return 0; |
| |
| prefixSum += root.val; |
| |
| int cur = hashMap.getOrDefault(prefixSum - targetSum, 0); |
| |
| hashMap.put(prefixSum, hashMap.getOrDefault(prefixSum, 0) + 1); |
| |
| int left = dfs(root.left, prefixSum, targetSum); |
| int right = dfs(root.right, prefixSum, targetSum); |
| |
| hashMap.put(prefixSum, hashMap.get(prefixSum) - 1); |
| return cur + left + right; |
| } |
| } |
| |
| struct TreeNode* lowestCommonAncestor(struct TreeNode* root, struct TreeNode* p, struct TreeNode* q){ |
| if(root == NULL) |
| |
| return NULL; |
| if(root == p || root == q) |
| |
| return root; |
| |
| struct TreeNode *left = lowestCommonAncestor(root->left, p, q); |
| |
| struct TreeNode *right = lowestCommonAncestor(root->right, p, q); |
| if(left == NULL) |
| |
| return right; |
| else if(right == NULL) |
| |
| return left; |
| else |
| |
| return root; |
| } |
| class Solution { |
| public: |
| int res = INT_MIN; |
| |
| |
| int dfs(TreeNode *root) { |
| if (root == nullptr) return 0; |
| int left = dfs(root->left); |
| int right = dfs(root->right); |
| |
| |
| res = max(res, left + right + root->val); |
| |
| |
| return max(max(left, right) + root->val, 0); |
| } |
| |
| int maxPathSum(TreeNode *root) { |
| dfs(root); |
| return res; |
| } |
| }; |
图
| struct Coordinate { |
| int x; |
| int y; |
| }; |
| |
| int res; |
| |
| struct Coordinate *stack; |
| |
| int top; |
| |
| int **visited; |
| |
| int directions[4][2] = {{-1, 0}, |
| {1, 0}, |
| {0, -1}, |
| {0, 1}}; |
| |
| |
| void dfs(char **grid, int rowSize, int columnSize, int x, int y) { |
| |
| visited[x][y] = 1; |
| if (grid[x][y] == '0') return; |
| |
| stack[top].x = x; |
| stack[top].y = y; |
| top++; |
| |
| while (top > 0) { |
| int tempX = stack[top - 1].x; |
| int tempY = stack[top - 1].y; |
| |
| int flag = false; |
| |
| for (int i = 0; i < 4; ++i) { |
| int newX = tempX + directions[i][0]; |
| int newY = tempY + directions[i][1]; |
| |
| if ((newX >= 0 && newX < rowSize && newY >= 0 && newY < columnSize) |
| && visited[newX][newY] == 0) { |
| |
| visited[newX][newY] = 1; |
| |
| if (grid[newX][newY] == '1') { |
| flag = true; |
| stack[top].x = newX; |
| stack[top].y = newY; |
| top++; |
| } |
| } |
| } |
| |
| if (!flag) top--; |
| } |
| |
| res++; |
| } |
| |
| int numIslands(char **grid, int gridSize, int *gridColSize) { |
| res = 0; |
| stack = (struct Coordinate *) malloc(sizeof(struct Coordinate) * gridSize * (*gridColSize)); |
| top = 0; |
| visited = (int **) malloc(sizeof(int *) * gridSize); |
| for (int i = 0; i < gridSize; ++i) |
| visited[i] = (int *) calloc(*gridColSize, sizeof(int)); |
| |
| for (int i = 0; i < gridSize; ++i) |
| for (int j = 0; j < *gridColSize; ++j) |
| |
| if (visited[i][j] == 0) |
| dfs(grid, gridSize, *gridColSize, i, j); |
| |
| return res; |
| } |
| |
| int directions[4][2] = {{-1, 0}, |
| {1, 0}, |
| {0, -1}, |
| {0, 1}}; |
| |
| |
| bool isCoordinateLegal(int rowSize, int columnSize, int x, int y) { |
| return x >= 0 && x < rowSize && y >= 0 && y < columnSize; |
| } |
| |
| |
| bool isVisited(char **grid, int x, int y) { |
| return grid[x][y] == '2'; |
| } |
| |
| void markVisited(char **grid, int x, int y) { |
| grid[x][y] = '2'; |
| } |
| |
| void dfs(char **grid, int rowSize, int columnSize, int x, int y) { |
| |
| markVisited(grid, x, y); |
| |
| |
| for (int i = 0; i < 4; ++i) { |
| int newX = x + directions[i][0]; |
| int newY = y + directions[i][1]; |
| |
| if (isCoordinateLegal(rowSize, columnSize, newX, newY) && !isVisited(grid, newX, newY)) { |
| if (grid[newX][newY] == '1') |
| dfs(grid, rowSize, columnSize, newX, newY); |
| } |
| } |
| } |
| |
| int numIslands(char **grid, int gridSize, int *gridColSize) { |
| int res = 0; |
| |
| for (int i = 0; i < gridSize; ++i) { |
| for (int j = 0; j < *gridColSize; ++j) { |
| |
| if (!isVisited(grid, i, j)) { |
| if (grid[i][j] == '1') { |
| res++; |
| dfs(grid, gridSize, *gridColSize, i, j); |
| } |
| markVisited(grid, i, j); |
| } |
| } |
| } |
| |
| return res; |
| } |
| struct Coordinate { |
| int x; |
| int y; |
| }; |
| |
| int directions[4][2] = {{-1, 0}, |
| {1, 0}, |
| {0, -1}, |
| {0, 1}}; |
| int rowSize; |
| int columnSize; |
| int sizeOfQueue; |
| int front; |
| int rear; |
| int freshNum; |
| |
| struct Coordinate *queue; |
| |
| bool isCoordinateLegal(int x, int y) { |
| return x >= 0 && x < rowSize && y >= 0 && y < columnSize; |
| } |
| |
| |
| void infect(int **grid, int x, int y) { |
| for (int i = 0; i < 4; ++i) { |
| int newX = x + directions[i][0]; |
| int newY = y + directions[i][1]; |
| if (isCoordinateLegal(newX, newY) && grid[newX][newY] == 1) { |
| |
| grid[newX][newY] = 2; |
| queue[rear].x = newX; |
| queue[rear].y = newY; |
| rear = (rear + 1) % sizeOfQueue; |
| |
| freshNum--; |
| } |
| } |
| } |
| |
| int orangesRotting(int **grid, int gridSize, int *gridColSize) { |
| rowSize = gridSize; |
| columnSize = *gridColSize; |
| sizeOfQueue = rowSize * columnSize + 1; |
| queue = (struct Coordinate *) malloc(sizeof(struct Coordinate) * sizeOfQueue); |
| front = 0; |
| rear = 0; |
| freshNum = 0; |
| |
| for (int i = 0; i < rowSize; ++i) { |
| for (int j = 0; j < columnSize; ++j) { |
| if (grid[i][j] == 2) { |
| |
| queue[rear].x = i; |
| queue[rear].y = j; |
| rear = (rear + 1) % sizeOfQueue; |
| } else if (grid[i][j] == 1) { |
| |
| freshNum++; |
| } |
| } |
| } |
| |
| |
| int res = 0; |
| while (front != rear) { |
| int tempRear = rear; |
| int count = (rear - front + sizeOfQueue) % sizeOfQueue; |
| while (count-- > 0) { |
| |
| int tempX = queue[front].x; |
| int tempY = queue[front].y; |
| front = (front + 1) % sizeOfQueue; |
| |
| infect(grid, tempX, tempY); |
| } |
| |
| if (rear != tempRear) res++; |
| } |
| |
| return freshNum == 0 ? res : -1; |
| } |
| |
| |
| bool canFinish(int numCourses, int **prerequisites, int prerequisitesSize, int *prerequisitesColSize) { |
| |
| int *inDegrees = (int *) calloc(numCourses, sizeof(int)); |
| |
| int stack[numCourses]; |
| int top = 0; |
| |
| |
| for (int i = 0; i < prerequisitesSize; ++i) |
| inDegrees[prerequisites[i][0]]++; |
| |
| for (int i = 0; i < numCourses; ++i) |
| if (inDegrees[i] == 0) |
| stack[top++] = i; |
| |
| |
| int leftEdgeCount = prerequisitesSize; |
| while (top != 0) { |
| int k = stack[--top]; |
| |
| for (int i = 0; i < prerequisitesSize; ++i) { |
| if (prerequisites[i][1] == k) { |
| |
| leftEdgeCount--; |
| |
| inDegrees[prerequisites[i][0]]--; |
| |
| if (inDegrees[prerequisites[i][0]] == 0) |
| stack[top++] = prerequisites[i][0]; |
| } |
| } |
| |
| } |
| |
| return leftEdgeCount == 0; |
| } |
| struct EdgeNode { |
| int vertex; |
| struct EdgeNode *next; |
| }; |
| |
| struct VertexNode { |
| int vertex; |
| struct EdgeNode *dummyHead; |
| }; |
| |
| struct Graph { |
| struct VertexNode *adjList; |
| int vertexNum; |
| int edgeNum; |
| }; |
| |
| struct Graph *createGraph(int numCourses, int **prerequisites, int prerequisitesSize) { |
| struct Graph *graph = (struct Graph *) malloc(sizeof(struct Graph)); |
| graph->vertexNum = numCourses; |
| graph->edgeNum = prerequisitesSize; |
| graph->adjList = (struct VertexNode *) malloc(sizeof(struct VertexNode) * numCourses); |
| for (int i = 0; i < numCourses; ++i) { |
| graph->adjList[i].dummyHead = (struct EdgeNode *) malloc(sizeof(struct EdgeNode)); |
| graph->adjList[i].vertex = i; |
| graph->adjList[i].dummyHead->next = NULL; |
| } |
| |
| |
| for (int i = 0; i < prerequisitesSize; ++i) { |
| struct EdgeNode *node = (struct EdgeNode *) malloc(sizeof(struct EdgeNode)); |
| node->vertex = prerequisites[i][0]; |
| struct EdgeNode *dummyHead = graph->adjList[prerequisites[i][1]].dummyHead; |
| |
| node->next = dummyHead->next; |
| dummyHead->next = node; |
| } |
| |
| return graph; |
| } |
| |
| |
| int *visited; |
| struct Graph *graph; |
| bool hasCircle; |
| |
| void dfs(int **prerequisites, int vertex) { |
| if (hasCircle) return; |
| |
| |
| visited[vertex] = 1; |
| |
| struct EdgeNode *cur = graph->adjList[vertex].dummyHead->next; |
| while (cur != NULL) { |
| if (visited[cur->vertex] == 1) { |
| |
| hasCircle = true; |
| return; |
| } |
| if (visited[cur->vertex] == 0) |
| |
| dfs(prerequisites, cur->vertex); |
| cur = cur->next; |
| } |
| |
| |
| visited[vertex] = 2; |
| |
| } |
| |
| |
| bool canFinish(int numCourses, int **prerequisites, int prerequisitesSize, int *prerequisitesColSize) { |
| visited = (int *) calloc(numCourses, sizeof(int)); |
| graph = createGraph(numCourses, prerequisites, prerequisitesSize); |
| |
| hasCircle = false; |
| for (int i = 0; i < numCourses; ++i) |
| if (visited[i] == 0) |
| dfs(prerequisites, i); |
| return !hasCircle; |
| } |
| |
| typedef struct TrieNode { |
| bool isEnd; |
| |
| struct TrieNode *children[26]; |
| } Trie; |
| |
| |
| Trie *trieCreate() { |
| Trie *root = (Trie *) malloc(sizeof(Trie)); |
| root->isEnd = false; |
| memset(root->children, 0, sizeof(root->children)); |
| return root; |
| } |
| |
| void trieInsert(Trie *obj, char *word) { |
| Trie *cur = obj; |
| int len = strlen(word); |
| for (int i = 0; i < len; ++i) { |
| char ch = word[i]; |
| if (cur->children[ch - 'a'] == NULL) { |
| Trie *node = (Trie *) malloc(sizeof(Trie)); |
| node->isEnd = false; |
| memset(node->children, 0, sizeof(node->children)); |
| |
| cur->children[ch - 'a'] = node; |
| } |
| |
| cur = cur->children[ch - 'a']; |
| } |
| cur->isEnd = true; |
| } |
| |
| bool trieSearch(Trie *obj, char *word) { |
| Trie *cur = obj; |
| int len = strlen(word); |
| for (int i = 0; i < len; ++i) { |
| char ch = word[i]; |
| |
| if (cur->children[ch - 'a'] == NULL) return false; |
| |
| cur = cur->children[ch - 'a']; |
| } |
| return cur->isEnd; |
| } |
| |
| bool trieStartsWith(Trie *obj, char *prefix) { |
| Trie *cur = obj; |
| int len = strlen(prefix); |
| for (int i = 0; i < len; ++i) { |
| char ch = prefix[i]; |
| |
| if (cur->children[ch - 'a'] == NULL) return false; |
| |
| cur = cur->children[ch - 'a']; |
| } |
| return true; |
| } |
| |
| void trieFree(Trie *obj) { |
| free(obj); |
| obj = NULL; |
| } |
回溯
| int **res; |
| int *hashMap; |
| int *rtSize; |
| |
| |
| void generate(int *nums, int numsSize, int *temp, int curIndex) { |
| |
| if (curIndex == numsSize) { |
| for (int i = 0; i < numsSize; ++i) { |
| res[(*rtSize)][i] = temp[i]; |
| } |
| (*rtSize)++; |
| return; |
| } |
| |
| for (int i = 0; i < numsSize; ++i) { |
| |
| if (hashMap[nums[i] + 10] == 0) { |
| temp[curIndex] = nums[i]; |
| |
| hashMap[nums[i] + 10] = 1; |
| |
| generate(nums, numsSize, temp, curIndex + 1); |
| |
| hashMap[nums[i] + 10] = 0; |
| } |
| } |
| } |
| |
| |
| int **permute(int *nums, int numsSize, int *returnSize, int **returnColumnSizes) { |
| |
| const int maxSize = 720; |
| *returnSize = 0; |
| res = (int **) malloc(sizeof(int *) * maxSize); |
| *returnColumnSizes = (int *) malloc(sizeof(int) * maxSize); |
| for (int i = 0; i < 720; ++i) { |
| res[i] = (int *) malloc(sizeof(int) * numsSize); |
| (*returnColumnSizes)[i] = numsSize; |
| } |
| |
| rtSize = returnSize; |
| |
| hashMap = (int *) calloc(21, sizeof(int)); |
| |
| int *temp = (int *) malloc(sizeof(int) * numsSize); |
| |
| generate(nums, numsSize, temp, 0); |
| |
| return res; |
| } |
| int **res; |
| int *rtSize; |
| |
| void swap(int *array, int left, int right) { |
| if (left == right) return; |
| int temp = array[left]; |
| array[left] = array[right]; |
| array[right] = temp; |
| } |
| |
| |
| void generate(int *nums, int numsSize, int *temp, int curIndex) { |
| |
| if (curIndex == numsSize) { |
| for (int i = 0; i < numsSize; ++i) { |
| res[(*rtSize)][i] = temp[i]; |
| } |
| (*rtSize)++; |
| return; |
| } |
| |
| |
| |
| int left = curIndex; |
| for (int right = left; right < numsSize; ++right) { |
| temp[curIndex] = nums[right]; |
| |
| swap(nums, left, right); |
| |
| generate(nums, numsSize, temp, curIndex + 1); |
| |
| swap(nums, left, right); |
| } |
| } |
| |
| |
| int **permute(int *nums, int numsSize, int *returnSize, int **returnColumnSizes) { |
| |
| const int maxSize = 720; |
| *returnSize = 0; |
| res = (int **) malloc(sizeof(int *) * maxSize); |
| *returnColumnSizes = (int *) malloc(sizeof(int) * maxSize); |
| for (int i = 0; i < 720; ++i) { |
| res[i] = (int *) malloc(sizeof(int) * numsSize); |
| (*returnColumnSizes)[i] = numsSize; |
| } |
| |
| rtSize = returnSize; |
| |
| int *temp = (int *) malloc(sizeof(int) * numsSize); |
| |
| generate(nums, numsSize, temp, 0); |
| |
| return res; |
| } |
| |
| class Solution { |
| public: |
| vector<vector<int>> res; |
| |
| void backtrack(vector<int> &nums, int curIndex) { |
| if (curIndex == nums.size()) { |
| res.emplace_back(nums); |
| return; |
| } |
| |
| |
| for (int i = curIndex; i < nums.size(); ++i) { |
| |
| swap(nums[i], nums[curIndex]); |
| |
| backtrack(nums, curIndex + 1); |
| |
| swap(nums[i], nums[curIndex]); |
| } |
| } |
| |
| |
| vector<vector<int>> permute(vector<int> &nums) { |
| backtrack(nums, 0); |
| return res; |
| } |
| }; |
| |
| class Solution { |
| public: |
| vector<vector<int>> res; |
| vector<int> output; |
| |
| |
| void backtrack(vector<int> &nums, int curIndex) { |
| |
| if (curIndex == nums.size()) { |
| res.emplace_back(output); |
| return; |
| } |
| |
| for (int i = 0; i < nums.size(); ++i) { |
| |
| if (nums[i] == INT_MIN) continue; |
| int temp = nums[i]; |
| |
| nums[i] = INT_MIN; |
| output.emplace_back(temp); |
| |
| backtrack(nums, curIndex + 1); |
| |
| output.pop_back(); |
| nums[i] = temp; |
| } |
| } |
| |
| |
| vector<vector<int>> permute(vector<int> &nums) { |
| backtrack(nums, 0); |
| return res; |
| } |
| }; |
| int **res; |
| int *rtSize; |
| int **rtColumnSize; |
| |
| void generate(int *nums, int numsSize, int *temp, int len, int curIndex, int nextStart) { |
| if (curIndex == len) { |
| |
| res[*rtSize] = (int *) malloc(sizeof(int) * len); |
| (*rtColumnSize)[*rtSize] = len; |
| for (int i = 0; i < len; ++i) |
| res[*rtSize][i] = temp[i]; |
| (*rtSize)++; |
| return; |
| } |
| |
| |
| |
| for (int i = nextStart; i < numsSize; ++i) { |
| |
| temp[curIndex] = nums[i]; |
| |
| generate(nums, numsSize, temp, len, curIndex + 1, i + 1); |
| } |
| } |
| |
| int **subsets(int *nums, int numsSize, int *returnSize, int **returnColumnSizes) { |
| const int maxSize = 1024; |
| res = (int **) malloc(sizeof(int *) * maxSize); |
| rtSize = returnSize; |
| *rtSize = 0; |
| rtColumnSize = returnColumnSizes; |
| *rtColumnSize = (int *) malloc(sizeof(int) * maxSize); |
| int *temp = (int *) malloc(sizeof(int) * numsSize); |
| |
| res[0] = NULL; |
| (*rtColumnSize)[0] = 0; |
| (*rtSize)++; |
| |
| |
| for (int len = 1; len <= numsSize; ++len) |
| generate(nums, numsSize, temp, len, 0, 0); |
| return res; |
| } |
| |
| int **subsets(int *nums, int numsSize, int *returnSize, int **returnColumnSizes) { |
| int **res = (int **) malloc(sizeof(int *) * (1 << numsSize)); |
| *returnColumnSizes = (int *) malloc(sizeof(int) * (1 << numsSize)); |
| *returnSize = 1 << numsSize; |
| |
| int temp[numsSize]; |
| |
| for (int mask = 0; mask < (1 << numsSize); ++mask) { |
| |
| int len = 0; |
| for (int i = 0; i < numsSize; ++i) { |
| |
| |
| if (mask & (1 << i)) { |
| temp[len++] = nums[i]; |
| } |
| } |
| int *tempRes = (int *) malloc(sizeof(int) * len); |
| memcpy(tempRes, temp, sizeof(int) * len); |
| (*returnColumnSizes)[mask] = len; |
| res[mask] = tempRes; |
| } |
| return res; |
| } |
| int **res; |
| int *rtSize; |
| int **rtColumnSize; |
| |
| void generate(int *nums, int numsSize, int *temp, int len, int cur) { |
| |
| if (cur == numsSize) { |
| int *tempRes = (int *) malloc(sizeof(int) * len); |
| memcpy(tempRes, temp, sizeof(int) * len); |
| (*rtColumnSize)[*rtSize] = len; |
| res[*rtSize] = tempRes; |
| (*rtSize)++; |
| return; |
| } |
| |
| temp[len] = nums[cur]; |
| generate(nums, numsSize, temp, len + 1, cur + 1); |
| |
| generate(nums, numsSize, temp, len, cur + 1); |
| } |
| |
| int **subsets(int *nums, int numsSize, int *returnSize, int **returnColumnSizes) { |
| res = (int **) malloc(sizeof(int *) * (1 << numsSize)); |
| rtSize = returnSize; |
| *rtSize = 0; |
| rtColumnSize = returnColumnSizes; |
| *rtColumnSize = (int *) malloc(sizeof(int) * (1 << numsSize)); |
| |
| int *temp = (int *) malloc(sizeof(int) * numsSize); |
| |
| generate(nums, numsSize, temp, 0, 0); |
| return res; |
| } |
| char **res; |
| int *rtSize; |
| char *temp; |
| char phoneMap[10][5] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; |
| int digitsLen; |
| |
| void generate(char *digits, int curIndex) { |
| |
| if (curIndex == digitsLen) { |
| temp[curIndex] = '\0'; |
| char *tempRes = (char *) malloc(sizeof(char) * (curIndex + 1)); |
| memcpy(tempRes, temp, sizeof(char) * (curIndex + 1)); |
| res[*rtSize] = tempRes; |
| (*rtSize)++; |
| return; |
| } |
| |
| char *phoneStr = phoneMap[digits[curIndex] - '0']; |
| for (int i = 0; i < strlen(phoneStr); ++i) { |
| |
| temp[curIndex] = phoneStr[i]; |
| |
| generate(digits, curIndex + 1); |
| } |
| } |
| |
| char **letterCombinations(char *digits, int *returnSize) { |
| *returnSize = 0; |
| digitsLen = strlen(digits); |
| if (digits == NULL || digitsLen == 0) return NULL; |
| |
| rtSize = returnSize; |
| res = (char **) malloc(sizeof(char *) * 256); |
| temp = (char *) malloc(sizeof(char) * 5); |
| |
| generate(digits, 0); |
| return res; |
| } |
| int *rtSize; |
| int **rtColumnSize; |
| int targetSum; |
| int **res; |
| int *temp; |
| |
| void generate(int *candidates, int candidateSize, int start, int curIndex, int tempSum) { |
| if (tempSum == targetSum) { |
| int *tempRes = (int *) malloc(sizeof(int) * curIndex); |
| memcpy(tempRes, temp, sizeof(int) * curIndex); |
| res[*rtSize] = tempRes; |
| (*rtColumnSize)[*rtSize] = curIndex; |
| (*rtSize)++; |
| return; |
| } |
| |
| |
| |
| |
| for (int i = start; i < candidateSize; ++i) { |
| |
| if (tempSum + candidates[i] > targetSum) continue; |
| |
| tempSum += candidates[i]; |
| temp[curIndex] = candidates[i]; |
| |
| generate(candidates, candidateSize, i, curIndex + 1, tempSum); |
| |
| tempSum -= candidates[i]; |
| } |
| } |
| |
| int **combinationSum(int *candidates, int candidatesSize, int target, int *returnSize, int **returnColumnSizes) { |
| *returnSize = 0; |
| rtSize = returnSize; |
| *returnColumnSizes = (int *) malloc(sizeof(int) * 150); |
| rtColumnSize = returnColumnSizes; |
| res = (int **) malloc(sizeof(int *) * 150); |
| temp = (int *) malloc(sizeof(int) * 20); |
| targetSum = target; |
| |
| generate(candidates, candidatesSize, 0, 0, 0); |
| return res; |
| } |
| char **res; |
| int *rtSize; |
| char *temp; |
| |
| void generate(int n, int curIndex, int leftBracketNum, int rightBracketNum) { |
| |
| if (leftBracketNum == 0 && rightBracketNum == 0) { |
| temp[curIndex] = '\0'; |
| char *tempRes = (char *) malloc(sizeof(char) * ((n << 1) + 1)); |
| memcpy(tempRes, temp, sizeof(char) * ((n << 1) + 1)); |
| res[(*rtSize)++] = tempRes; |
| return; |
| } |
| |
| if (leftBracketNum > 0) { |
| |
| temp[curIndex] = '('; |
| |
| generate(n, curIndex + 1, leftBracketNum - 1, rightBracketNum); |
| } |
| |
| if (leftBracketNum < rightBracketNum) { |
| |
| temp[curIndex] = ')'; |
| |
| generate(n, curIndex + 1, leftBracketNum, rightBracketNum - 1); |
| } |
| } |
| |
| char **generateParenthesis(int n, int *returnSize) { |
| *returnSize = 0; |
| rtSize = returnSize; |
| res = (char **) malloc(sizeof(char *) * (1 << (n << 1))); |
| temp = (char *) malloc(sizeof(char) * ((n << 1) + 1)); |
| |
| generate(n, 0, n, n); |
| return res; |
| } |
| bool res; |
| int len; |
| int rowSize; |
| int columnSize; |
| |
| void recursive(char **board, char *word, int curIndex, int curRow, int curColumn) { |
| |
| if (res) return; |
| |
| if (curIndex == len) { |
| res = true; |
| return; |
| } |
| |
| if ((curRow < 0 || curRow >= rowSize || curColumn < 0 || curColumn >= columnSize) |
| || (board[curRow][curColumn] == '0') |
| || (board[curRow][curColumn] != word[curIndex])) |
| return; |
| |
| |
| char tempChar = board[curRow][curColumn]; |
| board[curRow][curColumn] = '0'; |
| |
| |
| recursive(board, word, curIndex + 1, curRow - 1, curColumn); |
| |
| recursive(board, word, curIndex + 1, curRow + 1, curColumn); |
| |
| recursive(board, word, curIndex + 1, curRow, curColumn - 1); |
| |
| recursive(board, word, curIndex + 1, curRow, curColumn + 1); |
| |
| board[curRow][curColumn] = tempChar; |
| } |
| |
| bool exist(char **board, int boardSize, int *boardColSize, char *word) { |
| res = false; |
| len = strlen(word); |
| rowSize = boardSize; |
| columnSize = *boardColSize; |
| |
| for (int i = 0; i < rowSize; ++i) |
| for (int j = 0; j < columnSize; ++j) |
| |
| recursive(board, word, 0, i, j); |
| |
| return res; |
| } |
| class Solution { |
| public: |
| vector<vector<string>> res; |
| vector<string> output; |
| int len; |
| |
| |
| bool judge(string &str, int left, int right) { |
| while (left < right) { |
| if (str[left] != str[right]) return false; |
| left++; |
| right--; |
| } |
| return true; |
| } |
| |
| |
| void backtrack(string s, int curIndex) { |
| if (curIndex == len) { |
| res.emplace_back(output); |
| return; |
| } |
| |
| for (int right = curIndex; right < len; ++right) { |
| |
| if (!judge(s, curIndex, right)) continue; |
| |
| output.emplace_back(s.substr(curIndex, right - curIndex + 1)); |
| |
| backtrack(s, right + 1); |
| |
| output.pop_back(); |
| } |
| } |
| |
| vector<vector<string>> partition(string s) { |
| len = s.length(); |
| backtrack(s, 0); |
| return res; |
| } |
| }; |
| class Solution { |
| public: |
| vector<vector<string>> res; |
| |
| unordered_set<int> columns; |
| unordered_set<int> diagonals1; |
| unordered_set<int> diagonals2; |
| |
| vector<vector<string>> solveNQueens(int n) { |
| |
| vector<int> queens(n, -1); |
| backtrack(queens, n, 0); |
| return res; |
| } |
| |
| void backtrack(vector<int> &queens, int n, int row) { |
| if (row == n) { |
| vector<string> board = generateBoard(queens, n); |
| res.push_back(board); |
| } else { |
| for (int i = 0; i < n; i++) { |
| |
| if (columns.find(i) != columns.end()) continue; |
| |
| int diagonal1 = row - i; |
| if (diagonals1.find(diagonal1) != diagonals1.end()) continue; |
| |
| int diagonal2 = row + i; |
| if (diagonals2.find(diagonal2) != diagonals2.end()) continue; |
| |
| |
| queens[row] = i; |
| |
| columns.insert(i); |
| diagonals1.insert(diagonal1); |
| diagonals2.insert(diagonal2); |
| |
| backtrack(queens, n, row + 1); |
| |
| queens[row] = -1; |
| columns.erase(i); |
| diagonals1.erase(diagonal1); |
| diagonals2.erase(diagonal2); |
| } |
| } |
| } |
| |
| vector<string> generateBoard(vector<int> &queens, int n) { |
| vector<string> board; |
| for (int i = 0; i < n; i++) { |
| string row = string(n, '.'); |
| row[queens[i]] = 'Q'; |
| board.push_back(row); |
| } |
| return board; |
| } |
| }; |
| #include <string> |
| #include <vector> |
| |
| using namespace std; |
| |
| class Solution { |
| public: |
| vector<vector<string>> res; |
| |
| |
| vector<int> queens; |
| int limit; |
| |
| vector<vector<string>> solveNQueens(int n) { |
| |
| limit = (1 << n) - 1; |
| |
| queens.resize(n, -1); |
| backtrack(n, 0, 0, 0, 0); |
| return res; |
| } |
| |
| void backtrack(int n, int row, int columns, int diagonals1, int diagonals2) { |
| if (columns == limit) { |
| |
| res.emplace_back(generateBoard(n)); |
| return; |
| } |
| |
| int ban = columns | diagonals1 | diagonals2; |
| |
| int candidate = limit & (~ban); |
| |
| while (candidate != 0) { |
| |
| int place = candidate & (-candidate); |
| queens[row] = place; |
| |
| backtrack(n, row + 1, columns | place, (diagonals1 | place) >> 1, (diagonals2 | place) << 1); |
| |
| candidate ^= place; |
| } |
| } |
| |
| vector<string> generateBoard(int n) { |
| vector<string> board; |
| for (int i = 0; i < n; i++) { |
| string str; |
| for (int j = 0; j < n; ++j) { |
| if ((queens[i] & (1 << j)) != 0) { |
| str += 'Q'; |
| } else { |
| str += '.'; |
| } |
| } |
| board.emplace_back(str); |
| } |
| return board; |
| } |
| }; |
二分查找
| |
| int searchInsert(int *nums, int numsSize, int target) { |
| int left = 0, right = numsSize - 1; |
| int mid; |
| while (left <= right) { |
| mid = ((right - left) >> 1) + left; |
| if (nums[mid] >= target) |
| |
| right = mid - 1; |
| else |
| |
| left = mid + 1; |
| } |
| |
| |
| return left; |
| } |
| int rowSize; |
| int columnSize; |
| |
| |
| bool binarySearch(int **matrix, int target, int left, int right) { |
| if (left > right) return false; |
| int mid; |
| while (left <= right) { |
| mid = left + ((right - left) >> 1); |
| |
| int row = mid / columnSize; |
| int column = mid % columnSize; |
| int cur = matrix[row][column]; |
| if (cur == target) { |
| return true; |
| } else if (cur > target) { |
| |
| right = mid - 1; |
| } else { |
| |
| left = mid + 1; |
| } |
| } |
| return false; |
| } |
| |
| bool searchMatrix(int **matrix, int matrixSize, int *matrixColSize, int target) { |
| rowSize = matrixSize; |
| columnSize = *matrixColSize; |
| return binarySearch(matrix, target, 0, rowSize * columnSize - 1); |
| } |
| bool searchMatrix(int **matrix, int matrixSize, int *matrixColSize, int target) { |
| int row = 0, column = *matrixColSize - 1; |
| |
| while (row < matrixSize && column >= 0) { |
| int cur = matrix[row][column]; |
| if (cur == target) { |
| return true; |
| } else if (cur < target) { |
| |
| row++; |
| } else { |
| |
| column--; |
| } |
| } |
| return false; |
| } |
| |
| int binarySearch1(int *array, int size, int target) { |
| int left = 0, right = size - 1; |
| int mid; |
| while (left <= right) { |
| mid = ((right - left) >> 1) + left; |
| if (array[mid] >= target) |
| right = mid - 1; |
| else |
| left = mid + 1; |
| } |
| return left; |
| } |
| |
| |
| int binarySearch2(int *array, int size, int target) { |
| int left = 0, right = size - 1; |
| int mid; |
| while (left <= right) { |
| mid = ((right - left) >> 1) + left; |
| if (array[mid] <= target) |
| left = mid + 1; |
| else |
| right = mid - 1; |
| } |
| return right; |
| } |
| |
| int *searchRange(int *nums, int numsSize, int target, int *returnSize) { |
| int *res = (int *) malloc(sizeof(int) * 2); |
| *returnSize = 2; |
| int left = binarySearch1(nums, numsSize, target); |
| int right = binarySearch2(nums, numsSize, target); |
| if (left >= numsSize || nums[left] != target) { |
| res[0] = -1; |
| res[1] = -1; |
| } else { |
| res[0] = left; |
| res[1] = right; |
| } |
| return res; |
| } |
| |
| int binarySearchNums(int *nums, int target, int left, int right) { |
| if (left > right) return -1; |
| int mid = left + ((right - left) >> 1); |
| if (nums[mid] == target) return mid; |
| |
| if (nums[mid] >= nums[left]) { |
| |
| if ((left <= mid - 1) && nums[left] <= target && nums[mid - 1] >= target) |
| return binarySearchNums(nums, target, left, mid - 1); |
| else |
| return binarySearchNums(nums, target, mid + 1, right); |
| } else { |
| |
| if ((mid + 1 <= right) && nums[mid + 1] <= target && nums[right] >= target) |
| return binarySearchNums(nums, target, mid + 1, right); |
| else |
| return binarySearchNums(nums, target, left, mid - 1); |
| } |
| } |
| |
| int search(int *nums, int numsSize, int target) { |
| return binarySearchNums(nums, target, 0, numsSize - 1); |
| } |
| |
| int binarySearchNums(int *nums, int target, int left, int right) { |
| if (left > right) return -1; |
| int mid; |
| while (left <= right) { |
| mid = left + ((right - left) >> 1); |
| if (nums[mid] == target) return mid; |
| if (nums[mid] >= nums[left]) { |
| |
| if ((left <= mid - 1) && nums[left] <= target && nums[mid - 1] >= target) |
| right = mid - 1; |
| else |
| left = mid + 1; |
| } else { |
| |
| if ((mid + 1 <= right) && nums[mid + 1] <= target && nums[right] >= target) |
| left = mid + 1; |
| else |
| right = mid - 1; |
| } |
| } |
| return -1; |
| } |
| |
| int search(int *nums, int numsSize, int target) { |
| return binarySearchNums(nums, target, 0, numsSize - 1); |
| } |
| |
| int findMin(int *nums, int numsSize) { |
| int left = 0, right = numsSize - 1; |
| int min = nums[0]; |
| int mid; |
| |
| while (left <= right) { |
| mid = left + ((right - left) >> 1); |
| if (nums[mid] < min) min = nums[mid]; |
| if (nums[mid] >= nums[left]) { |
| |
| if (nums[left] < min) min = nums[left]; |
| |
| left = mid + 1; |
| } else { |
| |
| if ((mid + 1 <= right) && nums[mid + 1] < min) min = nums[mid + 1]; |
| |
| right = mid - 1; |
| } |
| } |
| return min; |
| } |
| |
| |
| int findMin(int *nums, int numsSize) { |
| int left = 0; |
| int right = numsSize - 1; |
| int mid; |
| |
| while (left < right) { |
| mid = left + ((right - left) >> 1); |
| if (nums[mid] > nums[right]) { |
| |
| left = mid + 1; |
| } else if (nums[mid] < nums[right]) { |
| |
| right = mid; |
| } |
| } |
| |
| |
| return nums[left]; |
| } |
| |
| |
| int findMin(int *nums, int numsSize) { |
| int left = 0; |
| int right = numsSize - 1; |
| int mid; |
| |
| while (left < right) { |
| mid = left + ((right - left) >> 1); |
| if (nums[mid] > nums[right]) { |
| |
| left = mid + 1; |
| } else if (nums[mid] < nums[right]) { |
| |
| right = mid; |
| } else { |
| |
| right--; |
| } |
| } |
| return nums[left]; |
| } |
| bool judgeMin(int *nums, int numsSize, int index) { |
| |
| if (nums[index] < nums[(index - 1 + numsSize) % numsSize] |
| && nums[index] < nums[(index + 1) % numsSize]) |
| return true; |
| return false; |
| } |
| |
| |
| int findMin(int *nums, int numsSize) { |
| int left = 0; |
| int right = numsSize - 1; |
| int mid; |
| |
| while (left < right) { |
| mid = left + ((right - left) >> 1); |
| |
| if (nums[left] <= nums[mid]) { |
| |
| if (judgeMin(nums, numsSize, left)) return nums[left]; |
| left = mid + 1; |
| } else if (nums[left] > nums[mid]) { |
| |
| if (judgeMin(nums, numsSize, mid)) return nums[mid]; |
| right = mid; |
| } |
| } |
| return nums[left]; |
| } |
| class Solution { |
| public: |
| int getKth(vector<int> &ary1, int start1, int end1, vector<int> &ary2, int start2, int end2, int k) { |
| |
| int len1 = end1 - start1 + 1; |
| int len2 = end2 - start2 + 1; |
| |
| |
| if (len1 == 0) return ary2[start2 + k - 1]; |
| if (len2 == 0) return ary1[start1 + k - 1]; |
| |
| |
| if (k == 1) return min(ary1[start1], ary2[start2]); |
| |
| |
| int i = start1 + min(len1, k / 2) - 1; |
| int j = start2 + min(len2, k / 2) - 1; |
| |
| if (ary1[i] < ary2[j]) { |
| |
| int excluded = i - start1 + 1; |
| |
| return getKth(ary1, i + 1, end1, ary2, start2, end2, k - excluded); |
| } else { |
| |
| int excluded = j - start2 + 1; |
| return getKth(ary1, start1, end1, ary2, j + 1, end2, k - excluded); |
| } |
| } |
| |
| |
| |
| double findMedianSortedArrays(vector<int> &nums1, vector<int> &nums2) { |
| int m = nums1.size(); |
| int n = nums2.size(); |
| |
| int left = (m + n + 1) / 2; |
| |
| int right = (m + n + 2) / 2; |
| |
| return (getKth(nums1, 0, m - 1, nums2, 0, n - 1, left) + getKth(nums1, 0, m - 1, nums2, 0, n - 1, right)) * 0.5; |
| } |
| }; |
| class Solution { |
| public: |
| |
| double findMedianSortedArrays(vector<int> &nums1, vector<int> &nums2) { |
| int m = nums1.size(); |
| int n = nums2.size(); |
| |
| if (m > n) return findMedianSortedArrays(nums2, nums1); |
| int iMin = 0, iMax = m; |
| |
| while (iMin <= iMax) { |
| int i = (iMin + iMax) / 2; |
| int j = (m + n + 1) / 2 - i; |
| |
| if (j != 0 && i != m && nums2[j - 1] > nums1[i]) { |
| |
| iMin = i + 1; |
| } else if (i != 0 && j != n && nums1[i - 1] > nums2[j]) { |
| |
| iMax = i - 1; |
| } else { |
| |
| int maxLeft = 0; |
| if (i == 0) |
| maxLeft = nums2[j - 1]; |
| else if (j == 0) |
| maxLeft = nums1[i - 1]; |
| else |
| maxLeft = max(nums1[i - 1], nums2[j - 1]); |
| |
| if ((m + n) % 2 == 1) |
| return maxLeft; |
| |
| int minRight; |
| if (i == m) |
| minRight = nums2[j]; |
| else if (j == n) |
| minRight = nums1[i]; |
| else |
| minRight = min(nums2[j], nums1[i]); |
| |
| |
| return (maxLeft + minRight) / 2.0; |
| } |
| } |
| return 0.0; |
| } |
| }; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步