【刷题】Java 代码随想录 + java 数据结构


我是按照代码随想录的顺序刷的,github 地址,看到记得给个star

刷题顺序
数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论->高级数据结构

数组

数组基础

  1. 数组是存放在连续内存空间上的相同类型数据的集合。
  2. 数组的元素是不能删的,只能覆盖。
  3. 在java中, 二维数组的每一行头结点的地址是没有规则的,更谈不上连续。

704. 二分查找

在这里插入图片描述

题解

/*
*给定一个n个元素有序的(升序)整型数组nums 和一个目标值target,写一个函数搜索nums中的
* target,如果目标值存在返回下标,否则返回 -1。
 */
public class Solution {
   
    public int search(int[] nums,int target){
   
        // 避免当 target 小于nums[0] nums[nums.length - 1]时多次循环运算
        if(target<nums[0]||target>nums[nums.length-1]){
   
            return -1;
        }  
        int left = 0;
        int right = nums.length-1;
        while(left<=right){
   
            int middle = left + (right-left)/2;  //  防止内存溢出 而不是使用int middle=(left+right)/2
            if(nums[middle]>target){
   
                right = middle;
            }else if(nums[middle]<target){
   
                left = middle;
            }else{
   
                return middle;
            }
        }
        return -1;
    }
}


想法

二分查找的条件

  1. 有序数组
  2. 无重复数据

二分查找需要注意的点

  1. 区间的划分 使用左闭右闭 所以right==left是有意义的
  2. 以后需要严格按照区间划分来写代码
  3. 区间的定义就是不变量,那么在循环中坚持根据查找区间的定义来做边界处理,就是循环不变量规则。

27. 移除元素

在这里插入图片描述

题解

class Solution {
   
    public int removeElement(int[] nums, int val) {
   
        int length = nums.length-1;
        int i=0; // 不等于val的元素数量
        int j=0; // 遍历元素
        while(j<=length){
   
            if(nums[j]!=val){
      // 将不等于val从头到尾拿出来  
                nums[i++] = nums[j]; // 用j处的数据覆盖i处的数据 i++
            }
            j++;
        }
        return i;
    }
}

想法

1.数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。


977.有序数组的平方

题解

class Solution {
   
    public int[] sortedSquares(int[] nums) {
   

        int[] res = new int[nums.length];   // 定义必须初始化
        int i = 0;
        int j = 0;
        int length = nums.length-1;
        while(i<=length){
   
            res[j++] = nums[i]*nums[i];
            i++;
        }

        // 排序
        // 冒泡排序  从小到大
        for(int m =0;m<=length;++m){
    // n次排序过程
            for(int n=1;n<=length-m;++n){
     //  为什么这里是n<length-m  知道了 因为一次排序 最大的数必排到了最后面
                if(res[n-1]>res[n]){
   
                    int temp = res[n-1];
                    res[n-1] = res[n];
                    res[n] = temp;
                }
            }
        }      
        return res;
    }
}

用双指针法 速度快

class Solution {
   
    public int[] sortedSquares(int[] nums) {
   
        // 双指针法
        // 最大的数必在最右边或者最左边
        // 不同的是  只能交换  不能覆盖
        int length = nums.length;
        int[] res = new 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值