0. 数组的API
- 新建
int[] A=new int[5];
int[] B={5,3,4};
Integer[] B1={5,3,4};
System.out.println(Arrays.toString(A));
System.out.println(Arrays.toString(B));
System.out.println(B1[1].equals(B1[2]));
- 遍历与修改
for(int i=0;i<B.length;i++){
System.out.println("B["+i+"]="+B[i]);
}
for(int a:B){
System.out.println(a);
- 排序
System.out.println("oldArray"+Arrays.toString(B));
Arrays.sort(B);
System.out.println("newArray"+Arrays.toString(B));
Integer [] data={1,3,7,5,2};
Arrays.sort(data,(a,b)->b.compareTo(a));
System.out.println(Arrays.toString(data));
Arrays.sort(data, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
});
System.out.println(Arrays.toString(data));
Integer[][] data1={{1,5},{1,4},{2,3},{2,4}};
Arrays.sort(data1, (o1,o2)->{
if(o1[0]==(o2[0])){ return o2[1]-(o1[0]);
}else{ return o1[0]-(o2[0]);
}
});
System.out.println(Arrays.deepToString(data1));
}
1. 704. 二分查找
- 题目展示
![](https://i-blog.csdnimg.cn/blog_migrate/4ca5cb6237ec07540ac7285fc993dc45.png#pic_center)
- 代码详情:
class Solution {
public int search(int[] nums, int target) {
int head=0;
int end=nums.length-1;
int middle;
while(head<=end){
middle=((end-head)>>1)+head;
if(nums[middle]==target){
return middle;
}else{
if(nums[middle]<target){
head=middle+1;
}else{
end=middle-1;
}
}
}
return -1;
}
}
- 解题思路
- 核心思路:二分查找
- 具体操作:选取三个指针:head,end和middle,middle每次都对半选取。大循环为一个while循环,head<=end,采用左闭右闭的方式。
- 注意事项:1)大的循环体里面是有等号;2)生成新的middle的时候,head和end要加+1或者-1;3)需要优化的地方就是middle的形成过程:middle=((end-head)>>1)+head,才用移位符。
2. 977. 有序数组的平方
- 题目展示
![](https://i-blog.csdnimg.cn/blog_migrate/706737d7976c737406c8199e48a161ac.png#pic_center)
2. 代码详情:
class Solution {
public int[] sortedSquares(int[] nums) {
int left=0;
int right=nums.length-1;
int[] result=new int[right+1];
int i=right;
while(left<=right){
if(nums[left]+nums[right]>0){
result[i--]=nums[right]*nums[right];
right--;
}else{
result[i--]=nums[left]*nums[left];
left++;
}
}
return result;
}
}
- 解题思路
- 核心思路:双指针
- 具体操作:双指针从两边开始,比较大的输出在最后一位上面。
- 注意事项:大的while循环需要里面是等号,因为需要把每一位数都存入结果中
1. 27. 移除元素
- 题目展示
- 代码详情:
class Solution {
public int removeElement(int[] nums, int val) {
int slow,fast;
for(slow=0,fast=0;fast<nums.length;fast++){
if(nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
}
- 解题思路
- 核心思路:快慢指针
- 具体操作:快指针进行遍历,如果遇到了非目标值,就把它赋值给慢指针,最后慢指针的大小即为结果的大小。
- 注意事项:单循环
4. 209. 长度最小的子数组
- 题目展示
![](https://i-blog.csdnimg.cn/blog_migrate/fd2789c1643b48a12325a7dd414af81f.png#pic_center)
2. 代码详情:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int sum=0;
int min=nums.length+1;
int slow=0;
int fast;
int subset;
for(fast=0;fast<nums.length;fast++){
sum+=nums[fast];
while(sum>=target){
subset=fast-slow+1;
min=subset<=min?subset:min;
sum-=nums[slow++];
}
}
return min=(min==nums.length+1)?0:min;
}
}
- 解题思路
- 核心思路:滑动窗口
- 具体操作:定义两个前后指针,以end指针作为循环对象,对head指针使用while循环,如果不超出,就一直向前。
- 注意事项:1)大循环是for,小循环是while;2)for循环一定要从0开始,不然会漏掉1的情况。
59. 螺旋矩阵 II
- 题目展示
![](https://i-blog.csdnimg.cn/blog_migrate/8360fc8bb277978867804a02bf464aa4.png#pic_center)
3. 代码详情:
class Solution {
public int[][] generateMatrix(int n) {
int[][] data=new int[n][n];
if(n==1) data[0][0]=1;
int X=0;
int Y=0;
int num=0;
while(n>1){
for(int x=X,y=Y ;y<X+n-1;y++){
data[x][y]=++num;
}
for(int x=X,y=Y+n-1;x<Y+n-1;x++){
data[x][y]=++num;
}
for(int x=X+n-1,y=X+n-1;y>=X+1;y--){
data[x][y]=++num;
}
for(int x=X+n-1, y=Y;x>=X+1;x--){
data[x][y]=++num;
}
n=n-2;
X++;
Y++;
if(n==1) data[X][Y]=++num;
}
return data;
}
}
- 解题思路
- 核心思路:定义边界,循环遍历
- 具体操作:就是要定义好遍历的规则。
1)方法一:与之前螺旋矩阵II不同的是,这个不再是规律的正方形了,故需要写出通式。
2)首先去除特殊情况;3)然后定义好四边的大小;4)逆时针你条边一条边遍历,遍历依次四边大小就要注意修正下;5)在遍历后面两条边的时候,for循环中约束有两条,即长和宽大小都要约束。 - 注意事项:1)最开始记录矩阵四边的序标(是序标不是长度);在对四边进行遍历的时候,x和y的约束都加上吧。(有两个约束)
1. 54. 螺旋矩阵
- 题目展示
![](https://i-blog.csdnimg.cn/blog_migrate/6f9090c6ce1c68c5fd1432dec85c47c9.png#pic_center)
2. 代码详情:
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
int X=0;
int Y=0;
int lX=matrix.length;
int lY=matrix[0].length;
int num=1;
while(lX>1 &&lY>1){
for(int x=X,y=Y;y<Y+lY-1;y++){
matrix[x][y]=num++;
}
for(int x=X,y=X+lY-1;x<x+lX-1;x++){
matrix[x][y]=num++;
}
for(int x=x+lX-1,y=X+lY-1;y>Y;y++){
matrix[x][y]=num++;
}
for(int x=X,y=X+lY-1;x<x+lX-1;x++){
matrix[x][y]=num++;
}
}
if(lX==1 && lY!=1){
}
if(lX!=1 && lY==1){
}
if(lX==1 && lY==1){
}
List<Integer> list=new ArrayList<>();
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[0].length;j++){
list.add(matrix[i][j]);
}
}
return list;
}
}
- 解题思路
- 核心思路:定义边界,循环遍历
- 具体操作:就是要定义好遍历的规则。
1)方法一:与之前螺旋矩阵II不同的是,这个不再是规律的正方形了,故需要写出通式。
2)首先去除特殊情况;3)然后定义好四边的大小;4)逆时针你条边一条边遍历,遍历依次四边大小就要注意修正下;5)在遍历后面两条边的时候,for循环中约束有两条,即长和宽大小都要约束。 - 注意事项:1)最开始记录矩阵四边的序标(是序标不是长度);在对四边进行遍历的时候,x和y的约束都加上吧。(有两个约束)