这应该是我写的第一篇博客,希望通过这种方式能够记录我自己的学习过程,同时也更督促我自己能够一直坚持学习并将博客写下去。
从今天开始应该会记录在leetcode从零开始学习和刷题的日常,平时也是用自己零碎的时间零敲碎打地学习,所以先给自己定一个小目标,希望自己能够每天至少完成两道题,学明白写明白吧。
因为之前有一些C语言的相关学习基础,所以直接从初级算法这本leetbook开始。一开始的两道题都是有关数组的算法题。第一道题是第26题,删除有序数组中的重复项,也就是删除数组中重复的项,并且最后返回数组中不重复项的项数,题目要求在原地删除数组中的元素,也就是不使用其他存储空间,这也使我一开始的想法不成立,一开始我想直接暴力求解,采用一个新的数组存储我需要保留下来的项,使用两重循环,每当发现有两项相等时,就将存储数组项数的变量减少1。但是这种方法并不符合这题的要求。于是学习了一下题解当中的解法,采用快慢指针的方法,用快指针遍历数组,发现与数组前几项中相同的元素,用慢指针指出当前存储不重复项的位置。实现数组中重复元素的原地删除
int removeDuplicates(int* nums, int numsSize) {
if (numsSize == 0) {
return 0;
}
int fast = 1, slow = 1;
while (fast < numsSize) {
if (nums[fast] != nums[fast - 1]) {
nums[slow] = nums[fast];
++slow;
}
++fast;
}
return slow;
}
第二题是第128题买卖股票的最佳时机。在这一题中在一个数组中,每一个元素代表一天股票的价格,你可以在这一天买和卖出股票,也可以在这一天买入,在随后几天中卖出,返回这几天中能够得到的最大收益。这题一时没有想到什么解决办法,所以观看了题解中的方法,对于动态规划的方法并没有能够真的理解到,可能还需要仔细地想一想。第二种方法,遍历数组一遍,只计算上升沿的数值差,再将其累加即可得到这几天购买股票能够得到的最大利润。因为在这题中,相当于买卖没有任何限制,即买即卖,所以如果下一天的股票价值大于前一天的股票价值就卖出,因此按照这样的方法就能够计算出本题中所要求得到的最大利润。动态规划的方法还需要在之后更加深入的研究和思考。
int maxProfit(int* prices, int pricesSize) {
int ans = 0;
for (int i = 1; i < pricesSize; ++i) {
if(prices[i] > prices[i-1]){
ans += prices[i] - prices[i - 1];
}
}
return ans;
}