502. IPO
题目
假设 力扣(LeetCode)即将开始 IPO 。为了以更高的价格将股票卖给风险投资公司,力扣 希望在 IPO 之前开展一些项目以增加其资本。 由于资源有限,它只能在 IPO 之前完成最多 k
个不同的项目。帮助 力扣 设计完成最多 k
个不同项目后得到最大总资本的方式。
给你 n
个项目。对于每个项目 i
,它都有一个纯利润 profits[i]
,和启动该项目需要的最小资本 capital[i]
。
最初,你的资本为 w
。当你完成一个项目时,你将获得纯利润,且利润将被添加到你的总资本中。
总而言之,从给定项目中选择 最多 k
个不同项目的列表,以 最大化最终资本 ,并输出最终可获得的最多资本。
答案保证在 32 位有符号整数范围内。
示例 1:
输入:k = 2, w = 0, profits = [1,2,3], capital = [0,1,1]
输出:4
解释:
由于你的初始资本为 0,你仅可以从 0 号项目开始。
在完成后,你将获得 1 的利润,你的总资本将变为 1。
此时你可以选择开始 1 号或 2 号项目。
由于你最多可以选择两个项目,所以你需要完成 2 号项目以获得最大的资本。
因此,输出最后最大化的资本,为 0 + 1 + 3 = 4。
示例 2:
输入:k = 3, w = 0, profits = [1,2,3], capital = [0,1,2]
输出:6
答案
class Solution {public int findMaximizedCapital(int k, int w, int[] profits, int[] capital) {int len = profits.length;int[][] arr = new int[len][2];for(int i=0;i<len;i++){arr[i][0] = capital[i];arr[i][1] = profits[i];}Arrays.sort(arr,(a,b)->a[0]-b[0]);PriorityQueue<Integer> queue = new PriorityQueue<>((a,b)->b-a);int index = 0;for(int i=0;i<k;i++){while(index<len && arr[index][0]<=w){queue.offer(arr[index][1]);index++;}if(!queue.isEmpty()){w += queue.poll();}else{break;}}return w;}
}
427. 建立四叉树
题目
给你一个 n * n
矩阵 grid
,矩阵由若干 0
和 1
组成。请你用四叉树表示该矩阵 grid
。
你需要返回能表示矩阵 grid
的 四叉树 的根结点。
四叉树数据结构中,每个内部节点只有四个子节点。此外,每个节点都有两个属性:
val
:储存叶子结点所代表的区域的值。1 对应 True,0 对应 False。注意,当isLeaf
为 False 时,你可以把 True 或者 False 赋值给节点,两种值都会被判题机制 接受 。isLeaf
: 当这个节点是一个叶子结点时为 True,如果它有 4 个子节点则为 False 。
class Node {public boolean val;public boolean isLeaf;public Node topLeft;public Node topRight;public Node bottomLeft;public Node bottomRight;
}
答案
class Solution {public Node construct(int[][] grid) {return deal(grid,0,0,grid.length,grid.length);}Node deal(int[][] grid,int r0,int c0,int r1,int c1){boolean same = true;for(int i=r0;i<r1;i++){for(int j=c0;j<c1;j++){if(grid[i][j]!=grid[r0][c0]){same = false;break;}}if(!same){break;}}if(same){return new Node(grid[r0][c0]==1,true);}Node curr = new Node(true,false,deal(grid,r0,c0,(r0+r1)/2,(c0+c1)/2),deal(grid,r0,(c0+c1)/2,(r0+r1)/2,c1),deal(grid,(r0+r1)/2,c0,r1,(c0+c1)/2),deal(grid,(r0+r1)/2,(c0+c1)/2,r1,c1));return curr;}}
148. 排序链表
题目
给你链表的头结点 head
,请将其按 升序 排列并返回 排序后的链表 。
输入:head = [4,2,1,3]
输出:[1,2,3,4]
输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]
示例 3:
输入:head = []
输出:[]
答案
class Solution {public ListNode sortList(ListNode head) {PriorityQueue<ListNode> queue = new PriorityQueue<>((a,b)->a.val-b.val);while(head!=null){queue.offer(head);head = head.next;}ListNode dummy = new ListNode();ListNode tail = dummy;while(!queue.isEmpty()){ListNode curr = queue.poll();tail.next = curr;tail = tail.next;}tail.next = null;return dummy.next;}
}
79. 单词搜索
题目
给定一个 m x n
二维字符网格 board
和一个字符串单词 word
。如果 word
存在于网格中,返回 true
;否则,返回 false
。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
答案
class Solution {int[][] dirs = {{1,0},{-1,0},{0,1},{0,-1}};int m,n;public boolean exist(char[][] board, String word) {m = board.length;n = board[0].length;for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(board[i][j]==word.charAt(0)){if(deal(board,word,i,j,0)){return true;}}}}return false;}boolean deal(char[][] board,String word,int i,int j,int k){if(k==word.length()){return true;}if(i<0 || i>=m || j<0 || j>=n || word.charAt(k)!=board[i][j]){return false;}char temp = board[i][j];board[i][j] = '0';boolean flag = false;for(int[] dir : dirs){flag = flag || deal(board,word,i+dir[0],j+dir[1],k+1);}board[i][j] = temp;return flag;}
}