提交 028e1405 编写于 作者: L liu13

20190301

上级 a7596590
package code;
/*
* 237. Delete Node in a Linked List
* 题意:删除链表中的一个节点,给的是这个节点,不知道前边的节点
* 难度:Easy
* 分类:Linked List
* 思路:剑指Offer上有,拷贝下一个节点的内容到该节点,倒数第二个节点置空
* Tips:
*/
public class lc237 {
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
public void deleteNode(ListNode node) {
ListNode pre = new ListNode(-1);
while(node.next!=null) {
node.val = node.next.val;
pre = node;
node = node.next;
}
pre.next = null;
}
}
package code;
import java.util.PriorityQueue;
/*
* 295. Find Median from Data Stream
* 题意:流数据中找中位数
* 难度:Hard
* 分类:
* 思路:用两个优先队列,一个保存左半边最大值,一个保存右半边最小值
* 保持左半边最多比右半边多一个数
* Tips:
*/
public class lc295 {
class MedianFinder {
PriorityQueue<Integer> pq1; //默认是最小,右半边
......
package code;
import java.util.Arrays;
/*
* 324. Wiggle Sort II
* 题意:小大小大小大 这样排序
* 难度:Medium
* 分类:Sort
* 思路:先找到中位数,然后一个小于中位数的,一个大于中位数的这样组合
* 用 index map 的方式可以使空间也为O(1)
* Tips:挺难的。
*/
public class lc324 {
public void wiggleSort(int[] nums) {
if(nums.length==1) return;
int n = nums.length, m = (n + 1) >> 1;// (nums.length+1)/2 注意+1
int[] copy = Arrays.copyOf(nums, n);
int median = findMedium(nums, 0, nums.length-1, m);
for (int i = 0, j = 0, k = n - 1; j <= k;) { // <medium的放左边, >在右边
if (copy[j] < median) {
swap(copy, i++, j++);
} else if (copy[j] > median) {
swap(copy, j, k--);
} else {
j++;
}
}
for (int i = m - 1, j = 0; i >= 0; i--, j += 2) nums[j] = copy[i]; //注意这点细节,i--倒着来,防止中位数重复的情况bug
for (int i = n - 1, j = 1; i >= m; i--, j += 2) nums[j] = copy[i];
}
private int getMiddle(int[] nums, int l, int r) {
int i = l;
for (int j = l + 1; j <= r; j++) {
if (nums[j] < nums[l]) swap(nums, ++i, j);
}
swap(nums, l, i);
return i;
}
private void swap(int[] nums, int i, int j) {
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
public static int findMedium(int[] nums, int left, int right, int k){
int cur = nums[left];
int l = left;
int r = right;
while(left<right){
while( left<right && nums[right]>=nums[left] ) right--;
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
while( left<right && nums[left]<nums[right]) left++;
temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
if(left==k-1) return nums[left];
else if(left>=k) return findMedium(nums, l, right-1, k);
else return findMedium(nums, right+1, r, k);
}
public static int newIndex(int index, int n) {
return (1 + 2*index) % (n | 1);
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册