1. 程式人生 > 其它 >排序連結串列 重排連結串列 最接近目標價格的甜點成本 環形連結串列

排序連結串列 重排連結串列 最接近目標價格的甜點成本 環形連結串列

148. 排序連結串列

弄到數組裡,陣列排序,再弄個新連結串列
List list = new ArrayList<>();
ListNode pre = head;
while(pre != null) {
list.add(pre.val);
pre = pre.next;
}
int[] ans = new int[list.size()];
for(int i = 0; i < list.size(); i++) {
ans[i] = list.get(i);
}
Arrays.sort(ans);
ListNode root = new ListNode(0);
head = root;
for(int i : ans) {
ListNode cur = new ListNode(i);
root.next = cur;
root = root.next;
}
return head.next;


143. 重排連結串列

List list = new ArrayList<>();直接將節點儲存在list中
ListNode root = head;
while(root != null) {
list.add(root);
root = root.next;
}
int left = 0;
int right = list.size() - 1;
while(left < right) {
list.get(left).next = list.get(right);交替
left++;
if(left == right) break;注意細節
list.get(right).next = list.get(left);
right--;
}
list.get(left).next = null;


1774. 最接近目標價格的甜點成本

int ans = Integer.MAX_VALUE;
public int closestCost(int[] baseCosts, int[] toppingCosts, int target) {
for(int i : baseCosts) {
ans = Math.min(ans, i);
}
/ans = Arrays.stream(baseCosts).min().getAsInt();/
for(int i : baseCosts) {
dfs(toppingCosts, 0, i, target);記錄不同起始值,更新到的答案
}
return ans;
}
public void dfs(int[] toppingCosts, int len, int cur, int target) {
if(Math.abs(ans - target) < cur - target) return ;細節:若是已經超過了target且差值還大於ans的可以直接剪去。因為後面的新增只會讓差值越來越大


else if(Math.abs(ans - target) >= Math.abs(cur - target)) {
if(Math.abs(ans - target) > Math.abs(cur - target)) {
ans = cur;
}else {誤差一樣,選擇成本少的
ans = Math.min(ans, cur);
}
}
if(len == toppingCosts.length) {
return ;
}
dfs(toppingCosts, len + 1, cur + toppingCosts[len] * 2, target);
dfs(toppingCosts, len + 1, cur + toppingCosts[len], target);
dfs(toppingCosts, len + 1, cur, target);
}


141. 環形連結串列

Set set = new HashSet<>();
if(head == null) return false;
while(head.next != null) {
if(!set.add(head)) {細節:set中如果新增已新增的元素,會返回false
return true;
}
head = head.next;
}
return false;