Java算法学习
- 对算法题进行练习和思路分析
第一天刷题算法:
-
题目:删除排序数组中的重复项
描述:给你一个有序数组 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; } }
-
题目:买卖股票的最佳时机
描述:给定一个数组,它的第 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; } }
-
题目:给定一个数组,将数组中的元素向右移动 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/