一樣是切分成左右邊、也是切成一個一個再合併。
想法1
我一開始想的是先把點按照某一軸離散化給出順序,
這樣有一個軸已經固定了,就轉換成2-D的問題了。
當然這是需要排序的
整體還是
所以我想說應該可行
想法2
另一個想法是一樣用合併的,
合併上就是由兩邊一個一個去比對,但目前只想到
有點糟糕
第一步是合併綠色紅色
第二步是合併藍色橘色
第三步是合併綠紅跟藍橘
這樣可以變成一個完整的一整塊
想法1複雜度比較好一點,但我好想找到D&C解
左半部(x=L\to L+d,y=y_p-d \to y_p-d)$裡面的做比較,
如果找到比 小的就去做更新
把角度取出來sort之後時間會是,太久了,
但如果原本就是有順序的節點,直接merge,(應該)就可以了
一個一個檢查,如果形成角度超過180度,就把它刪除
就是很簡單的把值取出來排序再丟回去
用merge的話,比較討厭的就是長度的部分跟ListNode要做一次開一次
有點麻煩,考慮到時間問題我就選擇實作簡單的方法,以後再補merge
15分鐘
完全自己解出
簡單的切半遞迴
分成三種情況
nums.size()>=2
,代表可以再切,所以把中間的節點放好之後就可以切成左右子樹nums.size()==1
,代表已經到尾端了,並且把剩下的那個數字放進節點nums.size()==0
,代表已經到尾端了,而且因為沒東西,所以回傳NULL不過這是我第一次在leetcode寫遞迴,讚喔
15分鐘
完全自己解出
我想了一小時還是出不來
上面是我想的過程的圖,很明顯我的方向錯了
所以我直接問同學大概怎麼寫
結果同學說用奇數偶數生成的方法
我就:「歐歐歐歐歐歐歐歐歐」
%%% 就出來ㄌ
作法1
從1開始
把陣列的每個值取出來加入(這邊是奇數)存到tmp
把陣列的每個值取出來(這邊是偶數)存到tmp
tmp就會是奇數在前偶數在後,而且長度是的兩倍
再把a設成tmp
再把的處理掉就可以了
作法2
王于桐大電神aka王卷桐提出用遞迴切左右邊
也是
間單來說就是把它會撞到中間那個值的部分通通丟到一側
這樣就可以避免被撞到
註:撞到是指a[i]+a[j]==a[k]*2
小想法:
因為作法2可以分左右
照理來說會按照二進位獲得左右移的方向
所以也許有公式解可以解掉這題
能夠把時間複雜度變成O(N)
也許而已,還沒想到
60+7+30
詢問同學/討論後,了解後解出
已填