LeeCode初级——数组篇1(删除重复项、买卖股票的最佳时机、旋转数组)

/*从排序数组中删除重复项
* 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
示例 1:
给定数组 nums = [1,1,2],
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
你不需要考虑数组中超出新长度后面的元素。
* */
package com.primary.Aarray;

public class Solution1 {
    public static int removDuplicates(int[]nums){
        int number=0;//计数,原地覆盖重复数字
        int len=nums.length;
        for (int i=0;i<len-1;i++){
            if (nums[i]!=nums[i+1]){
                number++;
                nums[number]=nums[i+1];
            }
        }
        return ++number;
    }
    public static void main(String[]args){
        int []nums={1,1,2,2,3,4,5,6,7,7,7,8,8,9};
        int number=removDuplicates(nums);
        for(int i=0;i<number;i++){
            System.out.println(nums[i]);
        }
    }
}

================================================================================================

/* 买卖股票的最佳时机 II
* 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入: [7,1,5,3,6,4]
输出: 7

示例 2:
输入: [1,2,3,4,5]
输出: 4
* */
//思路:贪心算法,总是做出在当前看来是最好的选择,不从整体最优上加以考虑,也就是说,只关心当前最优解
package com.primary.Aarray;

public class Solution2 {
    public  int maxProfit(int[] prices) {
        int profit=0;
        int tmp;
        int len=prices.length;
        if (len==0)
            return 0;
        for (int i=0;i<len-1;i++){
            tmp=prices[i+1]-prices[i];
            if (tmp>0)
                profit+=tmp;
        }
        return profit;
    }
    public static void main(String[] args){
        Solution2 solution2=new Solution2();
        int []prices={7,1,2,5,2,3,4,6};
        int maxprofit= solution2.maxProfit(prices);
        System.out.println("max profit:"+maxprofit);

    }
}

 

================================================================================================

/*旋转数组!!!!!!
* 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]
说明:

尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
要求使用空间复杂度为 O(1) 的原地算法。
* */
package com.primary.Aarray;

public class Solution3 {
}

/*
* 整个数组往右移动k次
* */
class Idea1{
    public int[] rotate(int[] nums, int k) {
        int tmp;
        int len=nums.length;
        for (int i=1;i<=k;++i){//第i次移动
            tmp=nums[len-1];
            for (int j=len-1;j>0;--j){//整个数组往右移动一次
                nums[j]=nums[j-1];
            }
            nums[0]=tmp;
        }
        return nums;
    }
    public static void main(String[]args){
        Idea1 idea1=new Idea1();
        int[]nums={1,2,3,4,5,6,7};
        int k=3;
        nums=idea1.rotate(nums,k);
        for (int num:nums){
            System.out.print(num+" ");
        }

    }

}


/**
1 2 3 4 5 6 7
1 2 3 1 5 6 7
1 2 3 1 5 6 4
1 2 7 1 5 6 4
1 2 7 1 5 3 4
1 6 7 1 5 3 4
1 6 7 1 2 3 4
5 6 7 1 2 3 4
 (i+k)%len
 循环len次
* */
class Idea2{
    public int[]rotate(int[] nums,int k){
        int len=nums.length;
        int tmpbefore;
        int tmpafter;
        int loc=0;
        tmpbefore=nums[loc];
        for (int i=0;i<len;i++){
            loc=(loc+k)%len;
            tmpafter=nums[loc];
            nums[loc]=tmpbefore;
            tmpbefore=tmpafter;
        }
        return nums;
    }

    public static void main(String[] args){
        Idea2 idea2=new Idea2();
        int[]nums={1,2,3,4,5,6,7};
        int k=3;
        nums=idea2.rotate(nums,k);
        for (int num:nums){
            System.out.print(num+" ");
        }
    }
}


/*
* 先把前n-k个数字翻转一下,再把后k个数字翻转一下,最后再把整个数组翻转一下:
* 或者先把整个数组翻转,再把前k个数字翻转,再把后n-k个数字翻转
* */
class Idea3{
    public int[] rotate(int []nums,int k){
        int tmp;
        int n;
        for (int i=0;i<3;i++){
            if (i==0)    n=nums.length;
            else if (i==1)  n=k;
            else  n=nums.length-k;
            for (int j=0;j<n/2;j++){
                tmp=nums[j];
                nums[j]=nums[n-1-i];
                nums[n-1-i]=tmp;
            }
        }
        return nums;
    }
    public static void main(String[] args){
        Idea3 idea3=new Idea3();
        int[]nums={1,2,3,4,5,6,7};
        int k=3;
        nums=idea3.rotate(nums,k);
        for (int num:nums){
            System.out.print(num+" ");
        }
    }

}

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值