首页 > 其他分享 >LeetCode hints

LeetCode hints

时间:2023-06-11 21:22:07浏览次数:22  
标签:cnt nums int dfs ans hints LeetCode 指针

通过样例得到一些通用性质,从单点出发结合要求什么,初步判断可以应用什么算法,之前见没见过类似的,见过就转换成之前会做的,怎么转换需要思考。

想不出来可以先出朴素的算法,然后才考虑优化

正着推不行就倒着推

结果和顺序无关就可以sort数组,复杂的需要sort index(由小到大排序且保持原序)

int ids[n];
iota(ids, ids + n, 0);
sort(ids, ids + n, [&](int i, int j) { return nums[i] < nums[j]; });

如果时间要求高,可以空间换时间,map用起来

switch比hashmap要快,int数组比map要快(但要注意+EXT防止越界)

 

枚举:

遇到影响全局的操作,一般会想到枚举操作次数。
非0即1的check,只check0或者1就可以了。

 

 

连续数组考虑双指针(同向,相向),前缀和

双指针

  • 同向双指针:
    • 滑动窗口(遍历右指针,然后固定右指针移动左指针)
    • 单调性:从满足到不满足/从不满足到满足,才能用双指针的滑动窗口
    • 209, 713,3
  • 相向双指针:
    • 167要求单调;15,11,42

前缀和

  • 前缀和不取当前元素
  • 不一定求数组sum前缀和,要灵活变通,如1248:可以求奇数个数和
  • 前缀异或和为0,表示两个数相等

二分

数组有序,答案有单调性,可以二分

看到「最大化最小值」或者「最小化最大值」就要想到二分答案

贪心

  • 局部最优,可以推出全局最优
  • 如果 k=0,k=1,应该如何选择呢?(思考问题可以先从一些简单的情况开始)

动态规划

DFS

两种写法

  • 选/不选:全部结果在最后的递归统一出
    • class Solution {
      public:
          int beautifulSubsets(vector<int>& nums, int k) {
              int cnt[3001]{};
              int ans=-1;
              function<void(int)> dfs = [&](int i){
                  if(i==nums.size())
                  {
                      ans++;
                      return;
                  }
                  dfs(i+1);
                  int x = nums[i] + k;
                  if(cnt[x-k]==0 && cnt[x+k]==0)
                  {
                      cnt[x]++;
                      dfs(i+1);
                      cnt[x]--;
                  }
              };
              dfs(0);
              return ans;
          }
      };
  • 遍历起始点:每个递归都是一次可行解
    • class Solution {
      public:
          int beautifulSubsets(vector<int>& nums, int k) {
              int cnt[3001]{};
              int ans=-1;
              function<void(int)> dfs = [&](int j){
                  ans++;
                  if(j==nums.size())return;
                  for(int i=j;i<nums.size();i++)
                  {
                      int x = nums[i] + k;
                      if(cnt[x-k]==0&&cnt[x+k]==0)
                      {
                          cnt[x]++;
                          dfs(i+1);
                          cnt[x]--;
                      }
                  }
              };
              dfs(0);
              return ans;
          }
      };
      

       

BFS

单调栈

分治

  • 求逆序数

排序

  • 快速排序
  • 归并排序
  • 堆排序

标签:cnt,nums,int,dfs,ans,hints,LeetCode,指针
From: https://www.cnblogs.com/demian/p/17473629.html

相关文章

  • leetcode 1171. 从链表中删去总和值为零的连续节点
    给你一个链表的头节点 head,请你编写代码,反复删去链表中由总和 值为0的连续节点组成的序列,直到不存在这样的序列为止。删除完毕后,请你返回最终结果链表的头节点。你可以返回任何满足题目要求的答案。(注意,下面示例中的所有序列,都是对 ListNode 对象序列化的表示。)示例1:输入:he......
  • Leetcode 1171. 从链表中删去总和值为零的连续节点
    题目:给你一个链表的头节点 head,请你编写代码,反复删去链表中由总和 值为0的连续节点组成的序列,直到不存在这样的序列为止。删除完毕后,请你返回最终结果链表的头节点。你可以返回任何满足题目要求的答案。(注意,下面示例中的所有序列,都是对 ListNode 对象序列化的表示。)难......
  • LeetCode 双周赛 106(2023/06/10)两道思维题
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]加入知识星球提问。往期回顾:LeetCode单周赛第348场·数位DP模版学会了吗?双周赛106概览T1.判断一个数是否迷人(Easy)标签:计数T2.找到最长的半重复子字符串(Medium)标签:同向双指针T3.移动机......
  • LeetCode 491. 递增子序列
    classSolution{public:vector<vector<int>>ans;vector<int>path;voiddfs(vector<int>nums,intidx)//选择path的下一个数填什么,从下标idx开始选{if(path.size()>=2)ans.push_back(path);if(idx==nums.size())......
  • LeetCode----二分查找
    1算法原理适用条件:有序数组2算法模板classSolution:defsearch(self,nums:List[int],target:int)->int:left=0right=len(nums)-1#规则[left,right]whileleft<=right:#根据规则,举例[1,1]添加=是否合法即可......
  • #yyds干货盘点# LeetCode程序员面试金典:环形链表
    题目:给你一个链表的头节点head,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。注意:pos不作为参数进行传递 。仅仅是为了标识链......
  • #yyds干货盘点# LeetCode程序员面试金典:移除链表元素
    1.简述:给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。 示例1:输入:head=[1,2,6,3,4,5,6],val=6输出:[1,2,3,4,5]示例2:输入:head=[],val=1输出:[]示例3:输入:head=[7,7,7,7],val=7输出:[]2.代码实现:class......
  • LeetCode 47. 全排列 II
    classSolution{public:vector<vector<int>>res;vector<int>path;boolst[10];voiddfs(vector<int>nums,intu){if(u==nums.size()){res.push_back(path);return;......
  • #yyds干货盘点# LeetCode程序员面试金典:单词接龙 II
    题目:按字典 wordList完成从单词beginWord到单词endWord转化,一个表示此过程的转换序列是形式上像beginWord->s1->s2->...->sk这样的单词序列,并满足:每对相邻的单词之间仅有单个字母不同。转换过程中的每个单词si(1<=i<=k)必须是字典 wordList中的单词。注意,be......
  • #yyds干货盘点# LeetCode程序员面试金典:快乐数
    1.简述:编写一个算法来判断一个数n是不是快乐数。「快乐数」 定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为1,也可能是无限循环但始终变不到1。如果这个过程结果为 1,那么这个数就是快乐数。如果n是快乐数就返回t......