T1 :二维网格迁移
思路:直接将二维数组放入一个List当中(将二维化为一维),然后按照偏移位置依次放入结果中即可。
public List> shiftGrid(int[][] grid, int k) {
int n = grid.length*grid[0].length;
List dict = new ArrayList<>();
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[i].length; j++) {
dict.add(grid[i][j]);
}
}
List> res = new ArrayList<>();
int flag = 0;
int red = grid[0].length;
List temp = new ArrayList<>();
k=k%n;
for (int i = n-k; i < n; i++) {
flag++;
if (flag % red==0){
temp.add(dict.get(i));
res.add(temp);
temp = new ArrayList<>();
}else {
temp.add(dict.get(i));
}
}
for (int i = 0; i < n-k; i++) {
flag++;
if (flag % red==0){
temp.add(dict.get(i));
res.add(temp);
temp = new ArrayList<>();
}else {
temp.add(dict.get(i));
}
}
return res;
}
思路:利用dfs将所有树的节点值生成,并放入到一个List中,然后当查找时直接在list中判断是否存在该值。
List dict = new ArrayList<>();
public FindElements(TreeNode root) {
dfsStructure(root,0,-1);
}
// L = 0 L 1 R
public void dfsStructure(TreeNode root,int val,int L){
if(root == null) return;
if(L==0){
root.val = val*2+1;
}else if(L == 1){
root.val = val*2+2;
}else root.val=0;
dict.add(root.val);
dfsStructure(root.left,root.val,0);
dfsStructure(root.right,root.val,1);
}
public boolean find(int target) {
return dict.contains(target);
}
T3:可被三整除的最大和
思路:由于每一个元素对3取余只有三种情况(余1、余2、被三整除)。所以可以直接利用该特性,首先把所有的数加起来,然后判断总和余3的结果,若余0直接返回,若余1则有两种情况(一个是减去一个余3为1的数 或者 减去两个余3为2的数),同理若余2也是类似。
public int maxSumDivThree(int[] nums) {
int n = nums.length;
int res = 0;
List dict1 = new ArrayList<>();
List dict2 = new ArrayList<>();
for (int i = 0; i < n; i++) {
if (nums[i]%3==1)dict1.add(nums[i]);
else if (nums[i]%3==2)dict2.add(nums[i]);
res+=nums[i];
}
Collections.sort(dict1);
Collections.sort(dict2);
if (res%3==1){
return Math.max(dict1.size()>0?res-dict1.get(0):-1,dict2.size()>1?res-dict2.get(0)-dict2.get(1):-1);
}else if (res%3==2){
return Math.max(dict1.size()>1?res-dict1.get(0)-dict1.get(1):-1,dict2.size()>0?res-dict2.get(0):-1);
}else
return res;
}