参加的第一场周赛
尴尬,只AC了第一题
第二题的太想当然了。
这两题的代码
class Solution {
public int[] numberGame(int[] nums) {
Stack<Integer> stack = new Stack<>();
int[] array = new int[nums.length];
Integer[] integers = Arrays.stream(nums).boxed().toArray(Integer[]::new);
Arrays.sort(integers, Collections.reverseOrder());
nums = Arrays.stream(integers).mapToInt(Integer::valueOf).toArray();
for (int i = 0; i < array.length; i = i+2) {
if(i + 1 < array.length)
stack.push(nums[i+1]);
stack.push(nums[i]);
}
// 打印栈中的元素
for (int i = 0; i < array.length; i++) {
array[i] = stack.pop();
}
return array;
}
}
class Solution {
public int maximizeSquareArea(int m, int n, int[] hFences, int[] vFences) {
//1. 通过hFences 与 vFences构建出可能的边长
if(m-1 == n-1){
return (n-1) * (n-1) % 1000000007;
}
Arrays.sort(hFences);
Arrays.sort(vFences);
Set<Integer> setH = new HashSet<Integer>();
Set<Integer> setV = new HashSet<Integer>();
setH.add(m-1);
setV.add(n-1);
for(int i = 0; i<hFences.length; i++){
int left = hFences[i] -1;
int right = m - hFences[i];
setH.add(left);
setH.add(right);
for(int j = i+1; j<hFences.length; j++){
int len = hFences[j] - hFences[i];
setH.add(len);
}
}
for(int i = 0; i<vFences.length; i++){
int left = vFences[i] -1;
int right = n - vFences[i];
setV.add(left);
setV.add(right);
for(int j = i+1; j<vFences.length; j++){
int len = vFences[j] - vFences[i];
setV.add(len);
}
}
// 获取边的交集
setH.retainAll(setV);
if(setH.isEmpty()){
return -1;
}
else{
long res = 1;
for(int num : setH){
res = Math.max(res, num);
}
return (int)(res*res%1000000007);
}
}
}
总的来说就是哈希Set不熟悉,如果想到把边分成三段就好
第一段是1,点,然后点到点。然后点到边长
从此分成三段,然后把长宽的值都纳入哈希Set
再在长宽的哈希表setH.retainAll(setV);,可以获取哈希的交集,从而找出是否存在正方形。
Comments NOTHING