NC01--股票(一次交易)、合并k个有序链表、字符串的排列、接雨水问题、输出二叉树的右视图

1、股票(一次交易)

https://www.nowcoder.com/practice/64b4262d4e6d4f6181cd45446a5821ec?tpId=117&&tqId=37717&rp=1&ru=/activity/oj&qru=/ta/job-code-high/question-ranking

根本用不上什么动态规划,直接遍历数组,然后找到最低价格,然后在后面减去最低价格,得到利润和最大利润进行比较,实现对最大的利润的更新,总之就是在遍历的过程中不断更新最小价格和最大利润。

import java.util.*;


public class Solution {
   
    /**
     * 
     * @param prices int整型一维数组 
     * @return int整型
     */
    public int maxProfit (int[] prices) {
   
        // write code here
        int minPrice = Integer.MAX_VALUE;
        int maxProfit = 0;
        for(int i = 0; i < prices.length; i++){
   
            if(minPrice > prices[i]){
   
                minPrice = prices[i];
            }else{
   
                maxProfit = Math.max(maxProfit, prices[i] - minPrice);
            }
        }
        return maxProfit;
    }
}

2、合并k个有序链表

https://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6?tpId=117&&tqId=37747&rp=1&ru=/activity/oj&qru=/ta/job-code-high/question-ranking

合并k个有序链表,还是一步步的实现,先写出两个链表合并的函数,然后在遍历k个有序链表,依次进行合并。两个有序链表的合并一定要熟练:有几个关键点:

  1. 要设置一个伪头结点
  2. 在实现一个节点的连接之后要更新当前节点
  3. 在跳出循环之后,需要判断还有那个链表没有遍历完,需要将这个没有遍历完的链表添加到尾部。
import java.util.*;
public class Solution {
   
    public ListNode mergeKLists(ArrayList<ListNode> lists) {
   
        ListNode ans = null;
        for (int i = 0; i < lists.size(); ++i) {
   
            ans = mergeTwo(ans, lists.get(i));
        }
        return ans;
    }
    private ListNode mergeTwo(ListNode l1, ListNode l2){
   
        ListNode headNode = new ListNode(-1);
        ListNode prev = headNode;
        while(l1 != null && l2 != null){
   
            if(l1.val >= l2.val){
   
                prev.next = l2;
                l2 = l2.next;
            }else{
   
                prev.next = l1;
                l1 = l1.

你可能感兴趣的:(#,牛客网高频50题)