当前位置:   article > 正文

2024.6.11 刷题总结

2024.6.11 刷题总结

2024.6.11

**每日一题**

419.甲板上的战舰,一看题目,就感觉是用dfs来求解,但是再想想更简易的方法。我们可以看到战舰是一个特殊的连通块,即一列或者一行,并且没有相邻的战舰,所以我们可以通过枚举战舰起点的方式来求解。遍历二维数组,如果找到'X',只需要判断其左边或者上面是否有'X'就可以判断出它是否是战舰的起点,如果是起点,那么答案加一。

15.三数之和,这一题我的方法是利用三种循环实现,但是最后会超时,于是我增加了一些剪枝操作,当一些情况下提前退出循环,但是始终无法通过,于是我发现了自己对于双指针的理解还没有很彻底。我认为我的代码实现了双指针,双循环枚举起点和终点,用while不断将mid向前,但是分析一下逻辑,这实际上还是三重循环,并没有真正实现双指针,所以这告诉我们,实现双指针不是用特定的代码结构就可以,而是真正的代码逻辑层面实现。所以我们应该通过枚举起点,固定终点,再枚举中间点,逐步寻找满足条件的三元组即可。

以下是我的错误代码,仅供思考:

  1. class Solution {
  2. public:
  3. vector<vector<int>> threeSum(vector<int>& nums) {
  4. int n=nums.size();
  5. sort(nums.begin(),nums.end());
  6. vector<vector<int>> ans;
  7. if(nums[0]>0||nums[n-1]<0) return ans;
  8. for(int i=0;i<n;i++){
  9. if(i>0&&nums[i]==nums[i-1]) continue;
  10. if(nums[i]>0) break;
  11. for(int j=n-1;j>i;j--)
  12. {
  13. if(j<n-1&&nums[j]==nums[j+1]) continue;
  14. if(nums[j]<0)
  15. int mid=i+1;
  16. while(mid<j){
  17. if((nums[i]+nums[j]+nums[mid]==0)&&(mid==i+1||nums[mid]!=nums[mid-1])) ans.push_back({nums[i],nums[mid],nums[j]});
  18. if(nums[i]+nums[mid]+nums[j]>0) break;
  19. mid++;
  20. }
  21. }
  22. }
  23. return ans;
  24. }
  25. };

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/718386
推荐阅读
相关标签
  

闽ICP备14008679号