力扣算法学习

Java算法学习

  • 对算法题进行练习和思路分析

第一天刷题算法:

  1. 题目:删除排序数组中的重复项
    描述:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。

    不要使用额外的数组空间,你必须在原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
    在这里插入图片描述
    代码及思路:

    class Solution {
        public int removeDuplicates(int[] nums) {
            //数组是排序的,然后从前往后进行比较然后开始
            int count = 0;//重复的数字个数
            //判断是否为空数组,如果为空,则返回0
            if(nums.length==0){
                    return 0;
            }
            //解题思路:双指针,从前往后依次进行比较,例如前两个比较,如果相同,则i继续往后走,
            //出现不同的时候,赋值count+1为此值,继续往后进行比较,此时count也是出现相同次数,
            //然后返回count+1为数组长度
            for(int i=1;i<nums.length;i++){
                
                if(nums[count]!=nums[i]){
                    count++;
                    nums[count]=nums[i];
                }        
            }
            return count+1;
        }
    }
    
    
    
  2. 题目:买卖股票的最佳时机
    描述:给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
    设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
    注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

    在这里插入图片描述

    class Solution {
        public int maxProfit(int[] prices) {
            //此题使用贪心算法比较好理解掌握,只需要把每一段都看出上升还是什么
            //只要是上涨的我们就要计算他们的差值进行累加,不需要再找开始上涨的最小值和最大值。
            if(prices == null || prices.length<2)
            return 0;
            int total=0;
            for(int i=0;i<prices.length-1;i++){
                //原数组中如果后一个减去前一个是正数,说明是上涨的,
            //我们就要累加,否则就不累加
            total+=Math.max(prices[i+1]-prices[i],0);
            }
            return total;
    
        }
    }
    
  3. 题目:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
    在这里插入图片描述

    class Solution {
        public void rotate(int[] nums, int k) {
            /*
            //方法一 最麻烦的直接转换
            //思路:直接循环k次,然后内部每次转换1次
            int flag=0;
            while(flag<k){
                int temp=nums[nums.length-1];
                for(int i=0;i<nums.length-1;i++){
                    nums[nums.length-i-1]=nums[nums.length-i-2];
                }
                nums[0]=temp;
                flag++;
            }
            //该方法超出时间限制了
            */
            /*
            //方法二:使用额外数组,赋值到另一个找到位置进行依次循环遍历赋值
            int n=nums.length;
            int newArr[] = new int[n];
            for (int i = 0; i < n; i++) {
                newArr[(i + k) % n] = nums[i];
            }
            System.arraycopy(newArr, 0, nums, 0, n);
            //System.arrayCopy(srcBytes,0,destBytes ,0,5)
            // 创建一个一维空数组,数组的总长度为 12位,然后将srcBytes源数组中 
            //从0位 到 第5位之间的数值 copy 到 destBytes目标数组中,在目标数组的第0位开始放置.
            */
            //方法三,利用旋转
            //解题思路:他们就是一直往后移动,然后先把数组全旋转,然后在把前面那部分和后面那部分旋转
        
            k=k%nums.length;
            reverse(nums,0,nums.length-1);
            reverse(nums,0,k-1);
            reverse(nums,k,nums.length-1);
        }//数组反转
        public void reverse(int[] nums,int start,int end){
            while(start<end){
            int temp=nums[start];
            nums[start]=nums[end];
            nums[end]=temp;
            start+=1;
            end-=1;
            }
        }
    }
    

题目和部分解题代码来自:力扣(LeetCode)
链接:https://leetcode-cn.com/

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值