1、Remove Element
链接:https://leetcode.com/problems/remove-element/
思路:将i,j分别指向头尾,nums[i] == val 且nums[j] != val, 用j的值覆盖i处的值
public int removeElement(int[] nums, int val) {
int len = nums.length, count = 0, i = 0, j = len - 1;
while(i <= j){
if(nums[i] == val){
while(j >= 0 && nums[j] == val)
j--;
if(i < j){
nums[i] = nums[j];
i++;
j--;
}else
return i;
}else{
i++;
}
}
return i;
}
2、Merge Sorted Array
链接:https://leetcode.com/problems/merge-sorted-array/
思路:从后面开始移动,减少重复移动
public void merge(int[] nums1, int m, int[] nums2, int n) {
int i = m - 1, j = n - 1, count = m + n - 1;
while(i >= 0 && j >= 0){
nums1[count--] = nums1[i] >= nums2[j] ? nums1[i--] : nums2[j--];
}
while(i >= 0){
nums1[count--] = nums1[i--];
}
while(j >= 0){
nums1[count--] = nums2[j--];
}
}
3、First Missing Positive
链接:https://leetcode.com/problems/first-missing-positive/
思路:将1放在0的位置,2放在1的位置,3放在2的位置,以此类推。。。循环找出不在位置上的数字
public int firstMissingPositive(int[] nums) {
int i = 0, temp;
while(i < nums.length){
if (nums[i] != i + 1 && nums[i] > 0 && nums[i] < nums.length && nums[i] != nums[nums[i] - 1]) {
temp = nums[i];
nums[i] = nums[nums[i] - 1];
nums[temp - 1] = temp;
} else {
++ i;
}
}
for (i = 0; i < nums.length; ++i) {
if (nums[i] != i + 1) return i + 1;
}
return nums.length + 1;
}
4、Spiral Matrix
链接:https://leetcode.com/problems/spiral-matrix/
思路:x1,y1 表示左上角位置;x2,y2表示右下角位置;有利于循环
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> list = new ArrayList<>();
if(matrix == null || matrix.length == 0 || matrix[0].length == 0)
return list;
int lenj = matrix[0].length, leni = matrix.length;
int x1 = 0, y1 = 0;
while(leni >= 1 && lenj >= 1){
int x2 = x1 + leni - 1;
int y2 = y1 + lenj - 1;
for(int j = y1; j <= y2; j++){
list.add(matrix[x1][j]);
}
for(int i = x1 + 1; i < x2; i++){
list.add(matrix[i][y2]);
}
if(leni > 1){
for(int j = y2; j >= y1; j--){
list.add(matrix[x2][j]);
}
}
if(lenj > 1){
for(int i = x2 - 1; i > x1; i--){
list.add(matrix[i][y1]);
}
}
leni -= 2;
lenj -= 2;
x1++;
y1++;
}
return list;
}
5、Spiral Matrix II
链接:https://leetcode.com/problems/spiral-matrix-ii/
思路:同上题
public int[][] generateMatrix(int n) {
if(n <= 0)
return new int[0][0];
int[][] num = new int[n][n];
int x1 = 0;
int temp = n,count = 0;
while(temp >= 1){
int x2 = x1 + temp -1 ;
for(int i = x1; i <= x2; i++)
num[x1][i] = ++count;
for(int i = x1 + 1; i <= x2; i++)
num[i][x2] = ++count;
if(temp > 1){
for(int i = x2 - 1; i >= x1; i--)
num[x2][i] = ++count;
for(int i = x2 - 1; i > x1; i--)
num[i][x1] = ++count;
}
temp -= 2;
x1++;
}
return num;
}
6、Rotate Image
链接:https://leetcode.com/problems/rotate-image/
思路:每次4个数字依次轮换。
public void rotate(int[][] matrix) {
int n = matrix.length;
int x = 0, y = 0, temp;
for(int i = 0; i < n/2; i++)
for(int j = i; j < n - i - 1; j++){
temp = matrix[i][j];
matrix[i][j] = matrix[n - 1 - j][i];
matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j];
matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i];
matrix[j][n - 1 - i] = temp;
}
}