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
    评论
LeetCode是一个在线的编程题库,提供了各种各样的算法和数据结构问题供开发者练习和提高编程能力。其中,提到了三个与数组相关的问题。 第一个引用是关于合并两个有序数组的问题,即将两个有序的整数数组合并成一个有序数组。具体的解法可以使用双指针法,分别指向两个数组的末尾,然后比较两个指针指向的元素大小,将较大的元素放入结果数组的末尾,然后将指针向前移动。这个过程重复直到其中一个数组遍历完毕,然后将剩下的元素依次放入结果数组中。 第二个引用是关于移除元素的问题,即移除数组中指定的元素,并返回新数组的长度。可以使用双指针法,左指针维护非指定元素的末尾位置,右指针遍历数组。当右指针指向的元素不等于指定元素时,将右指针指向的元素赋值给左指针指向的位置,然后将左指针和右指针都向前移动一位。直到右指针遍历完整个数组,最后返回左指针的值,即为新数组的长度。 第三个引用也是关于移动零元素的问题,即将数组中的零元素移动到数组末尾,同时保持非零元素的相对顺序不变。可以使用双指针法,左指针维护非零元素的末尾位置,右指针遍历数组。当右指针指向的元素不等于零时,将右指针指向的元素与左指针指向的元素交换位置,然后将左指针和右指针都向前移动一位。直到右指针遍历完整个数组,即完成了零元素的移动。 这些问题都可以使用双指针法解决,利用双指针在数组上进行遍历和操作,实现对数组的操作和处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [LeeCode每日一题–合并两个有序数组](https://download.csdn.net/download/weixin_38645669/14856034)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [LeeCode 数组题目](https://blog.csdn.net/weixin_43763903/article/details/114675786)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值