資料結構與演算法 優秀的競賽題

2022-07-24 11:36:11 字數 2467 閱讀 7072

leetcode:形成兩個異或相等陣列的三元組數目

題目描述:

給你乙個整數陣列 arr 。

現需要從陣列中取三個下標 i、j 和 k ,其中 (0 <= i < j <= k < arr.length) 。

a 和 b 定義如下:

a = arr[i] ^ arr[i + 1] ^ ... ^ arr[j - 1]

b = arr[j] ^ arr[j + 1] ^ ... ^ arr[k]

注意:^ 表示 按位異或 操作。

請返回能夠令 a == b 成立的三元組 (i, j , k) 的數目。

示例:

輸入:arr = [2,3,1,6,7]

輸出:4

解釋:滿足題意的三元組分別是 (0,1,2), (0,2,2), (2,3,4) 以及 (2,4,4)

思想:

理解這一點:「a==b」相當於「a ^ b == 0」。問題就變得簡單了。遍歷所有(i,k)區間即可。

關鍵是「a^b==0」這點太難想到了

**:

class solution 

if(!success(bloomday,max)) return -1;

return binarysearch(bloomday,0,max);

}private int binarysearch(int bloomday, int low, int high)

}

leetcode:最小體力消耗路徑

題目描述:

示例:

輸入:heights = [[1,2,2],[3,8,2],[5,3,5]]

輸出:2

解釋:路徑 [1,3,5,3,5] 連續格仔的差值絕對值最大為 2 。

這條路徑比路徑 [1,2,2,2,5] 更優,因為另一條路勁差值最大值為 3 。

思想:
方法一:二分查詢+bfs

主要思想:看完題目,我的思路是如何通過遍歷一遍得到最小「體力耗費值」,這種思路很難。換個方向去想,如果給定「體力耗費值」s,判斷當前s下能否到達目的地,就簡單多了,使用bfs搜尋+記憶化來完成。外層遍歷這個s可使用二分查詢。

程式設計技巧:

1.將bfs搜尋的方法獨立出來,更清晰;

2.boolean seen = new boolean[len*wid]可記憶已被遍歷過的節點(無需設定成二維);

3.每個節點取子節點有四個方向,可用乙個陣列存這四個方向:static int dirs = new int,,,};

4.注意,更新seen陣列時機,應該在取到子節點時候,而不是節點出隊之後,不然會超時。

**:

class solution 

}public int minimumeffortpath(int heights) }}

return seen[len*wid-1];

}private boolean inrange(int nx,int ny,int len,int wid)

}

leetcode:將 x 減到 0 的最小運算元

題目描述:

給你乙個整數陣列 nums 和乙個整數 x 。每一次操作時,你應當移除陣列 nums 最左邊或最右邊的元素,然後從 x 中減去該元素的值。請注意,需要 修改 陣列以供接下來的操作使用。

如果可以將 x 恰好 減到 0 ,返回 最小運算元 ;否則,返回 -1 。

示例:

輸入:nums = [3,2,20,1,1,3], x = 10

輸出:5

解釋:最佳解決方案是移除後三個元素和前兩個元素(總共 5 次操作),將 x 減到 0 。

思想:

思想:外部最小即找中間最大。用滑動視窗找最長的片段使得sum(片段)=sum(nums)-x

**:

class solution 

int total = sum - x;

int current = nums[0];

int low=0,high=1;

int res = len+1;

while(low<=high&&hightotal)

if(current==total) 中,[2,6] 最具競爭力。

思想:

在乙個無序陣列中找乙個有序序列,考慮使用單調棧來記憶。

直接通過k來確定棧中元素大小,這樣不合適,因為棧中元素是動態變化的。但是使用逆向思維,通過k可以確定 n-k,即可以確定出棧元素數量,控制出棧數量為n-k,剩下來的就是目標序列了。

**:

class solution 

stack.push(item);

}while(popnum>0)

int res = new int[k];

for(int i=k-1;i>=0;--i)

return res;

}}

演算法與資料結構實驗題1 9

實驗任務 上回說到,你奔走於各個世界線拯救靜靜。現在,完成任務的你決定玩個簡單的遊戲靜一靜。我們知道,數字在計算機裡是用二進位制儲存的,現在你想知道如果把乙個數字的二進位制倒過來是多少。比如 int a 5,用二進位制表示就是00000000000000000000000000000101。把它倒過...

演算法與資料結構 刷題日記

各種排序時間 空間複雜度 穩定性總結 一般把快排的空間複雜度看作o l ogn o logn o logn n個頂點的無向圖的鄰接矩陣有n個表頭節點,每個節點擊作乙個表頭,即可建立鄰接表。二叉排序樹 binary sort tree 或者是一棵空樹 或者是具有下列性質的二叉樹 憨憨題 若二叉樹用二叉...

資料結構與演算法 演算法 演算法和資料結構

資料結構與演算法 演算法 好吧,在這裡,您被優秀或優秀的軟體開發人員所隔開。在這種情況下,我會告訴您一開始或至少在我的情況下,並且我知道大多數時候,對於我認識的大多數人,您會覺得自己是乙個無能的人或白痴。基本上,我怎麼可能不理解這一點,然後您會感到沮喪。在這種情況下,我會告訴您情況並不像您想的那麼糟...