JZ3 数组中重复的数字⭐
1 /* 2 * ① map/set 3 * ② 因为"长度为n的数组里的所有数字都在0到n-1的范围内" 4 * 所以对数组进行调整使得 numbers[idx]==idx 5 * */ 6 public class JZ3_1 7 { 8 public static int duplicate(int[] numbers) 9 { 10 for (int idx = 0; idx < numbers.length; idx++) 11 { 12 while (idx != numbers[idx]) 13 { 14 if (numbers[idx] == numbers[numbers[idx]]) 15 return numbers[idx]; 16 int temp = numbers[numbers[idx]]; 17 numbers[numbers[idx]] = numbers[idx]; 18 numbers[idx] = temp; 19 } 20 } 21 return -1; 22 } 23 }
JZ51 数组中的逆序对
1 /* 归并 */ 2 public class JZ51_1 3 { 4 public static int res = 0; 5 public static final int MOD = 1000000007; 6 7 public static int InversePairs(int[] nums) 8 { 9 partition(nums, 0, nums.length - 1); 10 return res % MOD; 11 } 12 13 public static void partition(int[] nums, int left, int right) 14 { 15 if (left < right) 16 { 17 int mid = (left + right) / 2; 18 partition(nums, left, mid); 19 partition(nums, mid + 1, right); 20 merge(nums, left, mid, right); 21 } 22 } 23 24 public static void merge(int[] nums, int left, int mid, int right) 25 { 26 int l = left, r = mid + 1, k = 0; 27 int[] temp = new int[right - left + 1]; 28 while (l <= mid && r <= right) 29 { 30 if (nums[l] <= nums[r]) 31 { 32 temp[k++] = nums[l]; 33 l++; 34 } 35 else 36 { 37 temp[k++] = nums[r]; 38 res += (mid - l + 1); 39 res %= MOD; 40 r++; 41 } 42 } 43 while (l <= mid) 44 { 45 temp[k] = nums[l]; 46 k++; 47 l++; 48 } 49 while (r <= right) 50 { 51 temp[k] = nums[r]; 52 k++; 53 r++; 54 } 55 for (int i = 0; i < k; i++) 56 nums[left + i] = temp[i]; 57 } 58 } 59 60 /* ⭐树状数组⭐ */ 61 public class JZ51_2 62 { 63 public static int res = 0; 64 public static final int MOD = 1000000007; 65 public static int[] tree; 66 67 public static class KVCLass implements Comparable<KVCLass> 68 { 69 public int value; 70 public int idx; 71 72 KVCLass(int k, int v) 73 { 74 this.value = k; 75 this.idx = v; 76 } 77 78 @Override 79 public int compareTo(KVCLass o) 80 { 81 return value - o.value; 82 } 83 } 84 85 public static int InversePairs(int[] nums) 86 { 87 KVCLass[] temp = new KVCLass[nums.length]; 88 tree = new int[nums.length + 1]; 89 for (int i = 0; i < nums.length; i++) 90 temp[i] = new KVCLass(nums[i], i + 1); 91 Arrays.sort(temp); 92 for (int i = 0; i < temp.length; i++) 93 { 94 add(temp[i].idx); 95 res = (res + i - sum(temp[i].idx - 1)) % MOD; 96 } 97 return res; 98 } 99 100 private static int sum(int idx) 101 { 102 int ans = 0; 103 while (idx > 0) 104 { 105 ans = (ans + tree[idx]) % MOD; 106 idx -= (idx & (-idx)); 107 } 108 return ans; 109 } 110 111 private static void add(int idx) 112 { 113 while (idx < tree.length) 114 { 115 tree[idx] += 1; 116 idx += (idx & (-idx)); 117 } 118 } 119 }
JZ40 最小的K个数
1 /* ⭐快排⭐ */ 2 public class JZ40_1 3 { 4 public static ArrayList<Integer> GetLeastNumbers_Solution(int[] input, int k) 5 { 6 ArrayList<Integer> res = new ArrayList<>(); 7 int left = 0, right = input.length - 1; 8 while (true) 9 { 10 int idx = quickSort(input, left, right); 11 if (idx < k) 12 left = idx + 1; 13 else if (idx > k) 14 right = idx - 1; 15 else 16 break; 17 } 18 for (int i = 0; i < k; i++) 19 { 20 res.add(input[i]); 21 System.out.println(input[i]); 22 } 23 return res; 24 } 25 26 private static int quickSort(int[] input, int left, int right) 27 { 28 if (left >= right) return left; 29 int pivot = input[right], low = left, high = right; 30 while (low < high) 31 { 32 while (low < high && input[low] < pivot) low++; 33 input[high] = input[low]; 34 while (low < high && input[high] >= pivot) high--; 35 input[low] = input[high]; 36 } 37 input[low] = pivot; 38 return low; 39 } 40 } 41 42 /* 堆 */ 43 public class JZ40_2 44 { 45 public static ArrayList<Integer> GetLeastNumbers_Solution(int[] input, int k) 46 { 47 ArrayList<Integer> res = new ArrayList<>(); 48 PriorityQueue<Integer> queue = new PriorityQueue<>(k+1, new Comparator<Integer>() 49 { 50 @Override 51 public int compare(Integer o1, Integer o2) 52 { 53 return o2 - o1; 54 } 55 }); 56 for (int i = 0; i < input.length && k != 0; i++) 57 { 58 if (i < k) 59 queue.add(input[i]); 60 else 61 { 62 if (input[i] < queue.peek()) 63 { 64 queue.poll(); 65 queue.add(input[i]); 66 } 67 } 68 } 69 while (!queue.isEmpty()) 70 res.add(queue.poll()); 71 return res; 72 } 73 }
JZ41 数据流中的中位数⭐
1 /* 堆 */ 2 public class JZ41_1 3 { 4 public static PriorityQueue<Integer> minHeap = new PriorityQueue<>(); 5 public static PriorityQueue<Integer> maxHeap = new PriorityQueue<>(new Comparator<Integer>() 6 { 7 public int compare(Integer o1, Integer o2) 8 { 9 return o2 - o1; 10 } 11 }); 12 public static int count = 0; 13 14 public static void Insert(Integer num) 15 { 16 count++; 17 if (count % 2 != 0) 18 { 19 if (!minHeap.isEmpty() && num > minHeap.peek()) 20 { 21 maxHeap.add(minHeap.poll()); 22 minHeap.add(num); 23 } 24 else 25 maxHeap.add(num); 26 } 27 else 28 { 29 if (!maxHeap.isEmpty() && num < maxHeap.peek()) 30 { 31 minHeap.add(maxHeap.poll()); 32 maxHeap.add(num); 33 } 34 else 35 minHeap.add(num); 36 } 37 } 38 39 // public static void Insert(Integer num) 40 // { 41 // count++; 42 // if (count % 2 != 0) 43 // { 44 // minHeap.add(num); 45 // maxHeap.add(minHeap.poll()); 46 // } 47 // else 48 // { 49 // maxHeap.add(num); 50 // minHeap.add(maxHeap.poll()); 51 // } 52 // } 53 54 public static Double GetMedian() 55 { 56 if (minHeap.size() == maxHeap.size()) 57 return (minHeap.peek() + maxHeap.peek()) / 2.0; 58 else 59 return maxHeap.peek() * 1.0; 60 } 61 }标签:idx,offer,int,add,static,input,排序,public From: https://www.cnblogs.com/VividBinGo/p/17719835.html