日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

构造数组MaxTree、环形单链表的约瑟夫问题等总结

發布時間:2025/4/16 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 构造数组MaxTree、环形单链表的约瑟夫问题等总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.構造數組的MaxTree
定義二叉樹節點如下:
public class Node{
public int value;
public Node left;
public Node right;

public Node (int data){
this.value = data;
}
}
一個數組的MaxTree定義如下:
數組必須沒有重復元素,MaxTree是一棵二叉樹,數組的每一個值對應一個二叉樹的節點,包括MaxTree樹在內且在其中的每一棵子樹上,值最大的節點都是樹的頭。給定一個沒有重復元素的數組arr,寫出生成這個數組的MaxTree的函數,要求如果數組長度為N,則時間復雜度為O(N),額外空間復雜度為O(N)
思路:找一個數左邊離它最近的比它大的,還有右邊一個比他大的,即可實現MaxTree。建立一個大底棧,對于任何一個數,當它從棧中彈出時,當前將要入棧的數是彈出的數的右邊離他最近的比他大的數,而它棧中下面的數是離他最近的左邊比他大的數



2.最大值減去最小值小于或等于num的子數組數量
給定數組arr和整數num,共返回有多少個子數組滿足以下情況:
max(arr[i...j]) - min(arr[i...j]) <= num
max(arr[i...j])表示子數組arr[i...j]中的最大值,min(arr[i...j])表示子數組arr[i...j]中的最小值
要求:如果數組長度為N,求實現時間復雜度為O(N)的解法
建立一個雙端隊列,用于求出最大值和最小值,有兩個指針,都從數組頭開始向右滑動,維持一個遞增的隊列,此隊列中存儲的是數組的下標。如果隊列右邊比現在隊尾小的話,依次將隊列中的尾部從右彈出,直到可以將當前值右側入隊。

當隊列右邊界在向右移動時,隊列中的最大值只可能越來越小,左邊界在向右移動時,隊列中的最小值越來越大。

public static int getNum(int[] arr, int num){if(arr == null || arr.length == 0){return 0;}LinkedList<Integer> qmin = new LinkedList<Integer>();LinkedList<Integer> qmax = new LinkedList<Integer>();int i = 0;int j = 0;int res = 0;while(i < arr.length){while(j < arr.length){while(!qmin.isEmpty() && arr[qmin.peekLast()] >= arr[j]){qmin.pollLast();}qmin.adList(j);while(!qmax.isEmpty() && arr[qmax.peekLast()] <= arr[j]){qmax.polLast();}qmax.addLast(j);if(arr[qmax.getFirst()] - arr[qmin.getFirst()] > num){break;}j++;}if(qmin.peekFirst() == i){qmin.pollFirst();}res += j - i;i++;}return res; }
3.環形單鏈表的約瑟夫問題
41個人圍成一個環,由第一人開始報數,報到3的人即自殺,然后再由下一任重新報1,報到3的人再自殺,依次類推,直到剩下最后一個人。現用單向環形鏈表描述該結構并呈現整個自殺過程
輸入:一個環形單向鏈表的頭節點head和報數的值m
返回:最后生存下來的節點,且這個節點自己組成環形單向鏈表,其他節點都刪除
要求:如果鏈表節點數為N,實現時間復雜度為O(N)的解法

public static Node josephusKill(Node head, int m){if(head == null || head.next == head || m < 1){return head;}Node cur = head.next;int tmp = 1; //ListSizewhile(cur != head){tmp++;cur = cur.next;}tmp = getLive(tmp, m);while(--tmp != 0){head = head.next;}head.next = head;return head; } public static int getLive(int i, int m){if(i == 1){return 1;}return (getLive(i - 1, m) + m - 1) % i + 1; } public static void printCircularList(Node head){if(head == null){return;} }

總結

以上是生活随笔為你收集整理的构造数组MaxTree、环形单链表的约瑟夫问题等总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。