HIGH高频H2(11-20)(1)

class Solution {

public void merge(int[] nums1, int m, int[] nums2, int n) {

int p = m-- + n-- - 1;

while (m >= 0 && n >= 0) {

nums1[p–] = nums1[m] > nums2[n] ? nums1[m–] : nums2[n–];

}

while (n >= 0) {

nums1[p–] = nums2[n–];

}

}

HIGH.11 合并两个排序的链表

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。

示例1:

输入:1->2->4, 1->3->4

输出:1->1->2->3->4->4

限制:

0 <= 链表长度 <= 1000

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

迭代

class Solution {

public ListNode mergeTwoLists(ListNode l1, ListNode l2) {

ListNode dummyHead = new ListNode(-1), pre = dummyHead;

while (l1 != null && l2 != null) {

if (l1.val <= l2.val) {

pre.next = l1;

pre = pre.next;

l1 = l1.next;

} else {

pre.next = l2;

pre = pre.next;

l2 = l2.next;

}

}

if (l1 != null) {

pre.next = l1;

}

if (l2 != null) {

pre.next = l2;

}

return dummyHead.next;

}

}

递归

class Solution {

public ListNode mergeTwoLists(ListNode l1, ListNode l2) {

if (l1 == null) {

return l2;

}

if (l2 == null) {

return l1;

}

if (l1.val <= l2.val) {

l1.next = mergeTwoLists(l1.next, l2);

return l1;

} else {

l2.next = mergeTwoLists(l1, l2.next);

return l2;

}

}

}

HIGH.12 合并K 个排序链表

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例 1:

输入:lists = [[1,4,5],[1,3,4],[2,6]]

输出:[1,1,2,3,4,4,5,6]

解释:链表数组如下:

[

1->4->5,

1->3->4,

2->6

]

将它们合并到一个有序链表中得到。

1->1->2->3->4->4->5->6

示例 2:

输入:lists = []

输出:[]

示例 3:

输入:lists = [[]]

输出:[]

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/merge-k-sorted-lists

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路巨简单,难得一次都不用调试!!!循环直接搞定,什么分治大法我不懂!

用容量为K的最小堆优先队列,把链表的头结点都放进去,然后出队当前优先队列中最小的,挂上链表,,然后让出队的那个节点的下一个入队,再出队当前优先队列中最小的,直到优先队列为空。

class Solution {

public ListNode mergeKLists(ListNode[] lists) {

if (lists.length == 0) {

return null;

}

ListNode dummyHead = new ListNode(0);

ListNode curr = dummyHead;

PriorityQueue pq = new PriorityQueue<>(new Comparator() {

@Override

public int compare(ListNode o1, ListNode o2) {

return o1.val - o2.val;

}

});

for (ListNode list : lists) {

if (list == null) {

continue;

}

pq.add(list);

}

while (!pq.isEmpty()) {

ListNode nextNode = pq.poll();

curr.next = nextNode;

curr = curr.next;

if (nextNode.next != null) {

pq.add(nextNode.next);

}

}

return dummyHead.next;

}

}

HIGH.13 买卖股票的最佳时机

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。

注意:你不能在买入股票前卖出股票。

示例 1:

输入: [7,1,5,3,6,4]

输出: 5

解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。

注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。

示例 2:

输入: [7,6,4,3,1]

输出: 0

解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路还是挺清晰的,还是DP思想:

记录【今天之前买入的最小值】

计算【今天之前最小值买入,今天卖出的获利】,也即【今天卖出的最大获利】

比较【每天的最大获利】,取最大值即可

class Solution {

public int maxProfit(int[] prices) {

if(prices.length <= 1)

return 0;

int min = prices[0], max = 0;

for(int i = 1; i < prices.length; i++) {

max = Math.max(max, prices[i] - min);

min = Math.min(min, prices[i]);

}

return max;

}

}

HIGH.14 买卖股票的最佳时机II

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

输入: [7,1,5,3,6,4]

输出: 7

解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。

随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。

示例 2:

输入: [1,2,3,4,5]

输出: 4

解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。

注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。

因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

示例 3:

输入: [7,6,4,3,1]

输出: 0

解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

算法题(×) 脑筋急转弯题( √ )

扫描一遍 只要后一天比前一天大 就把这两天的差值加一下

class Solution {

public int maxProfit(int[] prices) {

int ans=0;

for(int i=1;i<=prices.length-1;i++)

{

if(prices[i]>prices[i-1])

{

ans+=prices[i]-prices[i-1];

}

}

return ans;

}

}

HIGH.15 最大子序和

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4]

输出: 6

解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

进阶:

如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/maximum-subarray

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {

public int maxSubArray(int[] nums) {

int res = nums[0];

int sum = 0;

for (int num : nums) {

if (sum > 0)

sum += num;

else

sum = num;

res = Math.max(res, sum);

}

return res;

}

}

HIGH.16 最小栈

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

push(x) —— 将元素 x 推入栈中。

pop() —— 删除栈顶的元素。

top() —— 获取栈顶元素。

getMin() —— 检索栈中的最小元素。

示例:

输入:

[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”]

[[],[-2],[0],[-3],[],[],[],[]]

输出:

[null,null,null,null,-3,null,0,-2]

解释:

MinStack minStack = new MinStack();

minStack.push(-2);

minStack.push(0);

minStack.push(-3);

minStack.getMin();   --> 返回 -3.

minStack.pop();

minStack.top();      --> 返回 0.

minStack.getMin();   --> 返回 -2.

提示:

pop、top 和 getMin 操作总是在 非空栈 上调用。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/min-stack

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class MinStack {

private Node head;

public void push(int x) {

if(head == null)

head = new Node(x, x);

else

head = new Node(x, Math.min(x, head.min), head);

}

public void pop() {

head = head.next;

}

public int top() {

return head.val;

}

public int getMin() {

return head.min;

}

private class Node {

int val;

int min;

Node next;

private Node(int val, int min) {

this(val, min, null);

}

private Node(int val, int min, Node next) {

this.val = val;

this.min = min;

this.next = next;

}

}

}

HIGH.17 LRU 缓存机制

运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制 。

实现 LRUCache 类:

LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存

int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。

void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】 在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。

进阶:你是否可以在 O(1) 时间复杂度内完成这两种操作?

示例:

输入

[“LRUCache”, “put”, “put”, “get”, “put”, “get”, “put”, “get”, “get”, “get”]

[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]

输出

[null, null, null, 1, null, -1, null, -1, 3, 4]

解释

LRUCache lRUCache = new LRUCache(2);

lRUCache.put(1, 1); // 缓存是 {1=1}

lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}

lRUCache.get(1);    // 返回 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值