/*从排序数组中删除重复项
* 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 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+" ");
}
}
}