package Java_Input;import java.io.*;
import java.util.*;
import java.text.*;
public class demo01 {public static void main(String[] args) throws IOException {//快读1BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//快读2StreamTokenizer st = new StreamTokenizer(new InputStreamReader(System.in));//快写PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));st.nextToken();int m = (int) st.nval;st.nextToken();int n = (int) st.nval;int[][] arr = new int[m][n];for(int i=0;i<m;i++) {for(int j=0;j<n;j++) {st.nextToken();arr[i][j] = (int) st.nval;}}List<Integer> ans =new ArrayList<>();if(arr.length == 0)pw.println(ans);int l = 0, r = arr[0].length - 1, t = 0, b = arr.length - 1;while(true) {for(int i=l;i<=r;i++)ans.add(arr[t][i]);//从左向右遍历if(++t>b)break;//等于的时候是最后一行for(int i=t;i<=b;i++)ans.add(arr[i][r]);//从上往下遍历if(l>--r)break;for(int i=r;i>=l;i--)ans.add(arr[b][i]);//从右向左遍历if(t>--b)break;for(int i=b;i>=t;i--)ans.add(arr[i][l]);//从下往上遍历if(++l>r)break;}pw.println(ans);//一定要记得关流pw.close();br.close();}
}
public static void main(String[] args) throws IOException {//快读1BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//快读2StreamTokenizer st = new StreamTokenizer(new InputStreamReader(System.in));//快写PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));st.nextToken();int n = (int) st.nval;int[][] arr = new int[n][n];for(int i=0;i<n;i++) {for(int j=0;j<n;j++) {st.nextToken();arr[i][j] = (int) st.nval;}}for(int i=0;i<n/2;i++) {for(int j=0;j<(n+1)/2;j++){int temp = arr[i][j];arr[i][j] = arr[n-1-j][i];arr[n-1-j][i] = arr[n-1-i][n-1-j];arr[n-1-i][n-1-j] = arr[j][n-1-i];arr[j][n-1-i] = temp;}}//一定要记得关流for(int i=0;i<n;i++)for(int j=0;j<n;j++)pw.print(arr[i][j]);pw.close();br.close();}
行交换 并且对称 能实现顺时针90度 列交换并对称 能实现逆时针90度
class Solution {public void rotate(int[][] matrix){for(int i=0;i<matrix.length/2;i++){int[] temp = matrix[i];matrix[i]=matrix[matrix.length-i-1];matrix[matrix.length-i-1]=temp;}for(int i=0;i<matrix.length;i++) {for (int j = 0; j < i; j++) {int temp=matrix[i][j];matrix[i][j]=matrix[j][i];matrix[j][i]=temp;}}}
}
二分模板一共有两个,分别适用于不同情况。
算法思路:假设目标值在闭区间[l, r]中, 每次将区间长度缩小一半,当l = r时,我们就找到了目标值。
版本1
当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid + 1;,计算mid时不需要加1。
C++ 代码模板:
int bsearch_1(int l, int r)
{
while (l < r)
{
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
版本2
当我们将区间[l, r]划分成[l, mid - 1]和[mid, r]时,其更新操作是r = mid - 1或者l = mid;,此时为了防止死循环,计算mid时需要加1。
C++ 代码模板:
int bsearch_2(int l, int r)
{
while (l < r)
{
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
}
o表示true ,表示false 而v本身也要是true
如果我们的目标是下面这个v,那麽就必须使用模板 1
................vooooooooo
假设经由 check 划分后,整个区间的属性与目标v如下,则我们必须使用模板 2
oooooooov...................
所以下次可以观察 check 属性再与模板1 or 2 互相搭配就不会写错啦
左加右减 减需要还
class Solution {public boolean searchMatrix(int[][] matrix, int target) {int m = matrix.length, n = matrix[0].length;for (int i = 0; i < m; i++) {int l = 0, r = n - 1;while (l < r) {int mid = l + r + 1 >> 1;if (matrix[i][mid] <= target) l = mid;else r = mid - 1;}if (matrix[i][r] == target) return true;}return false;}
}
class Solution {public boolean searchMatrix(int[][] matrix, int target) {//m行n列int m = matrix.length;int n= matrix[0].length;int i=0,j=n-1;while(i<=m-1&&j>=0){int temp = matrix[i][j];if(target>temp)i++;else if(target<temp)j--;else return true;}return false;}
}