IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LeetCode——1.数组2:(2)移除元素(283.移动零、977.有序数组的平方) -> 正文阅读

[数据结构与算法]LeetCode——1.数组2:(2)移除元素(283.移动零、977.有序数组的平方)

目录

283.移动零

方法一 双指针法

方法二 一遍遍历

方法三 增强for循环

977.有序数组的平方

方法一:冒泡排序法的思想

方法二:从两边开始比较

方法三:从中间开始比较


283.移动零

题目链接

给定一个数组?nums,编写一个函数将所有?0?移动到数组的末尾,同时保持非零元素的相对顺序。

请注意?,必须在不复制数组的情况下原地对数组进行操作。

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

方法一 双指针法

第一段代码是在循环里就把末尾的0替换掉了。

第二段代码又单独设了个count用来记不等于0的个数,循环结束之后为数组末尾添加0。

class Solution {
    public void moveZeroes(int[] nums) {
        int Slow = 0;
        for(int fast = 0; fast < nums.length; fast++) {
            if(nums[Slow] != 0) {
                Slow++;
            }else if(nums[Slow] == 0 && nums[fast] != 0) {
                nums[Slow++] = nums[fast];
                nums[fast] = 0;
            }
        }
    }
}
class Solution {
    public void moveZeroes(int[] nums) {
        int fast = 0;
        int count = 0;
        for(int slow = 0; fast < nums.length; fast++){
            if(nums[fast] != 0) {
                count++;
                nums[slow++] = nums[fast];
            }
        }
        while(count < nums.length){
            nums[count++] = 0;
        }
    }
}

方法二 一遍遍历

只设一个指针来遍历数组,count来记0的个数,count != 0说明数组里面找到了0,如果之后指向的元素不等于0,就让它往前移coun个单位,让当前指向的元素等于0。

class Solution {
    public void moveZeroes(int[] nums) {
        int count = 0;
        for(int point = 0; point < nums.length; point++) {
            if(nums[point] == 0) {
                count++;
            }
            if(nums[point] != 0 && count != 0){
                nums[point-count] = nums[point];
                nums[point] = 0;
            }
        }
    }
}

方法三 增强for循环

增强for循环:遍历nums数组,把值赋给num,注意num不是数组是值,所以在循环里面可以判断num的值来给nums数组赋值,循环结束之后为nums数组赋0。

class Solution {
    public void moveZeroes(int[] nums) {
        int i = 0;
        for(int num : nums) {
            if(num != 0) {
                nums[i++] = num;
            }
        }
        while(i < nums.length) {
            nums[i++] = 0;
        }
    }
}

977.有序数组的平方

题目链接

给你一个按?非递减顺序?排序的整数数组?nums,返回?每个数字的平方?组成的新数组,要求也按?非递减顺序?排序。

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]

方法一:冒泡排序法的思想

class Solution {
    public int[] sortedSquares(int[] nums) {
        int i = 0;
        int temp;
        for(int num : nums) {
            nums[i++] = num * num;
        }
        for(int a = 0; a < nums.length-1; a++) {
            for(int b = 0; b < nums.length-1; b++) {
                if(nums[b+1] < nums[b]) {
                    temp = nums[b];
                    nums[b] = nums[b+1];
                    nums[b+1] = temp;
                }
            }
        }
        return nums;
    }
}

方法二:从两边开始比较

class Solution {
    public int[] sortedSquares(int[] nums) {
        int right = nums.length - 1;
        int left = 0;
        int point = right;
        int[] arr = new int[nums.length];
        while(left <= right) {
            if((nums[right] *nums[right]) > (nums[left] * nums[left])) {
                arr[point--] = nums[right] * nums[right];
                right--;
            }else {
                arr[point--] = nums[left] * nums[left];
                left++;
            }
        }
        return arr;
    }
}

方法三:从中间开始比较

找到第一个正数,把nums数组里的元素平方存到新的数组arr里,从第一个正数和最后一个负数的位置开始比较,最后判断剩下元素的情况(刚开始还一直以为只能返回数组nums,之后一看其他题解,都返回的新数组,5555~所以又重新写的第二种方法)

class Solution {
    public int[] sortedSquares(int[] nums) {
        int i = 0;
        int[] arr = new int[nums.length];
        // 找到第一个正数
        for(int num : nums) {
            if(num > 0)
                break; 
            i++;
        }
        int right = i;
        int left = i - 1;
        i = 0;
        // 把nums数组元素平方放到arr数组里
        for(int num : nums) {
            arr[i++] = num * num;
        }
        i = 0;
        // 开始比较了
        while(left >= 0 && right < nums.length) {
            if(arr[right] < arr[left]) {
                nums[i++] = arr[right++];
            }else {
                nums[i++] = arr[left--];
            }
        }
        // 判断left和right有没有到头
        if(left < 0) {
            while(right < nums.length) {
                nums[i++] = arr[right++];
            }
        }
        if(right >= nums.length) {
            while(left >= 0) {
                nums[i++] = arr[left--];
            }
        }
        return nums;
    }
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-09-15 02:14:53  更:2022-09-15 02:17:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 21:47:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码