力扣_数组

删除排序数组中的重复项

// 设置两个指针,一个是快指针fast,一个是慢指针slow
// fast的作用是扫描出第一个新的元素然后赋值给slow所指的位置
// 最后slow所指的位置就是最后一个新元素,所指向的序号+1就是数组中不重复数的个数
class Solution {
    public int removeDuplicates(int[] nums) {
      
      //n 代表 nums 数组的长度
      int n = nums.length;
      //设置快指针 fast 和 慢指针 slow
      int fast = 1;
      //slow也是1的原因是为了后面序号不用再加1
      int slow = 1;
      while(fast < n){
          if(nums[fast] != nums[fast-1]){
              nums[slow] = nums[fast];
              slow++;
          }
          fast++;
      }
      return slow;
    }
}
 
 

买卖股票的最佳时机 II

//贪心算法
//只要存在后一项元素大于前一项元素就将其加入总和中
class Solution {
    public int maxProfit(int[] prices) {
        //数组prices的长度
        int n = prices.length;
        //返回最大值
        int max = 0;
        for(int i = 0;i < n-1;i++){
            if((prices[i+1] - prices[i]) > 0){
                max = max + (prices[i+1] - prices[i]);
            }
        }
        return max;
    }
}
 
 

旋转数组

// 使用了三次的倒置
// 第一次是全部倒置一次
// 第二次是前k个元素倒置一次
// 第三次是除前k个元素外剩下元素倒置一次

class Solution {
    public void rotate(int[] numsint k) {
        //nums的长度
        int n = nums.length;
        //有可能k大于数组的本身长度,要用除余n来调整!!!
        k = k % n;
        //第一次倒置
        reverse(nums,0,n-1);
        //第二次倒置
        reverse(nums,0,k-1);
        //第三次倒置
        reverse(nums,k,n-1);
    }
    //倒置算法
    public void reverse(int[] rev,int front,int end){
        while(front < end){
            int temp = rev[front];
            rev[front] = rev[end];
            rev[end] = temp;
            front++;
            end--;
        }
    }
}
 

存在重复元素

//先排序
//然后逐步后移,判断两者是否相同,若相同则返回true
class Solution {
    public boolean containsDuplicate(int[] nums) {
        //排序算法Arrays.sort()
        Arrays.sort(nums);
        //nums的长度
        int n = nums.length;
        for(int i = 0 ;i < n-1;i++){
            if(nums[i] == nums[i+1]){
                return true;
            }
        }
        return false;
    }
}
 
 

只出现一次的数字

// 先用temp暂存一个数
// 然后循环整个数组求出该元素出现的次数time
// 若整轮下去time == 1,则返回这个数

class Solution {
    public int singleNumber(int[] nums) {
        //求数组nums的长度
        int n = nums.length;
        for(int i = 0;i < n;i++){
            int temp = nums[i];
            int time = 0;
            for(int j = 0;j < n;j++){
                if(temp == nums[j]){
                    time++;
                }
            }
            if(time == 1){
                return nums[i];
            }
        }
        return 0;
    }
}
 

两个数组的交集 II

// 先对 nums1 数组 和 nums2 数组进行从小到大的排序
// 设一个数组num,长度和nums1、nums2中的最小长度一样
// 若nums1和nums2的元素相同,则存入nums中
// 否则,最小的那一个数组的序号往后移一位,直到num1或num2数组的序号移动最后面
class Solution {
    public int[] intersect(int[] nums1int[] nums2) {
        //排序数组nums1和nums2
        Arrays.sort(nums1);
        Arrays.sort(nums2);

        //求数组nums1和数组nums2的长度
        int n1 = nums1.length;
        int n2 = nums2.length;

        //设一个新数组
        int n = 0;
        if(n1 > n2){
            n = n2;
        }else{
            n = n1;
        }
        int[] nums = new int[n];
        //开始往nums中存数
        //i代表nums1的序号,j代表nums2的序号,k代表nums的序号
        int i = 0;
        int j = 0;
        int k = 0;
        while(i < n1 && j < n2){
            if(nums1[i] == nums2[j]){
                nums[k] =nums1[i];
                i++;
                j++;
                k++;
            }else if(nums1[i] < nums2[j]){
                i++;
            }else{
                j++;
            }
        }
        //Arrays.copyOfRange(nums,from,to)
        //复制数组nums,from下标开始,to下标结束.但是不包括to.
        return Arrays.copyOfRange(nums,0,k);
    }
}
 

加一

//若不全为0,则从后往前找第一个不为9的元素,并且将其加1,其后面的元素都要置为0
// 若数组的元素都是9,那么重新设一个数组,数组长度是原始数组长度+1,头一个元素设置为1

class Solution {
    public int[] plusOne(int[] digits) {
        //求数组digits的长度
        int n = digits.length;
        
        //寻找第一个不为9的元素,若找到后且不是第一个元素,则将其加1并且后面的元素都置为0
        for(int i = n-1;i >= 0;--i){
            if(digits[i] != 9){
                digits[i]++;
                for(int j = i + 1;j < n;j++){
                    digits[j] = 0;
                 }            
                return digits;
            }
        }

        //若数组的元素都为9,则重新设置一个数组,数组长度为原来数组长度加1
        int[] rev = new int[n+1];
        rev[0] = 1;
        return rev;
    }
}
 

移动零

//设置两个指针
//slow指针用来定位第一个是0的序号
//fast指针用来定位当前的序号
//当fast指针指向的元素不为0的时候,slow中的元素与fast中的元素交换
class Solution {
    public void moveZeroes(int[] nums) {
        //求nums的长度
        int n = nums.length;

        //遍历整个数组,寻找第一个为0的序号和第一个不为0的序号
        int fast = 0;
        int slow = 0;
        while(fast < n){
            if(nums[fast] != 0){
                swap(nums,fast,slow);
                slow++;
            }
            fast++;
        }
    }
    
    //交换
    public void swap(int[] jh,int fast,int slow){
        int temp = jh[fast];
        jh[fast] = jh[slow];
        jh[slow] = temp;
    }
}
 

两数之和

//暴力解法

class Solution {
    public int[] twoSum(int[] numsint target) {
        
        //求数组nums的长度
        int n = nums.length;

        int i = 0;
        int j = 0;
        
        for(i = 0; i < n-1;i++){
            for(j = i+1;j < n;j++){
                if(target == (nums[i] + nums[j]) ){
                    return new int[]{i,j};
                }
            }
        }
        return new int[0];
    }
}
 

有效的数独

//设置三个数组分别存储行,列,三三是否有重复的
//设行row为二维数组,第一个标识着第几行,第二个表示该数出现了几次
//设列column为二维数组,第一个标识着第几列,第二个表示该数出现了几次
//设Three为三维数组,前两维表示哪个三维数组,后一位表示该数在该三维数组中出现了几次

class Solution {
    public boolean isValidSudoku(char[][] board) {
        int[][] rows = new int[9][9];
        int[][] columns = new int[9][9];
        int[][][] subboxes = new int[3][3][9];
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                char c = board[i][j];
                if (c != '.') {
                    int index = c - '0' - 1;
                    rows[i][index]++;
                    columns[j][index]++;
                    subboxes[i / 3][j / 3][index]++;
                    if (rows[i][index] > 1 || columns[j][index] > 1 || subboxes[i / 3][j / 3][index] > 1) {
                        return false;
                    }
                }
            }
        }
        return true;
    }
}
 

旋转图像

//旋转90度,相当于先水平(中间)对换,再对角线(135度方向)对换;

class Solution {
    public void rotate(int[][] matrix) {
        //求的是matrix的行数,或列数;行数=列数
        int n = matrix.length;

        //水平对换
        for(int i = 0;i < n/2;i++){
            for(int j = 0;j < n;j++){
                int temp = matrix[i][j];
                matrix[i][j] = matrix[n-i-1][j];
                matrix[n-i-1][j] = temp;
            }
        }

        //对交换对换
        for(int i = 0; i < n;i++){
            for(int j = 0;j < i;j++){
                int temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }
    }
}
posted @ 2022-03-07 15:18  Space-guan  阅读(99)  评论(0)    收藏  举报