leetcode刷题技巧

本文记录一下在刷leetcode算法题过程中积累的一些技巧和方法:

Java本地调试

  • 81.搜索旋转排序数组-ii.java为例,其代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/*
* @lc app=leetcode.cn id=81 lang=java
*
* [81] 搜索旋转排序数组 II
*/

// @lc code=start
class Solution {
public boolean search(int[] nums, int target) {
int first = 0;
int last = nums.length;
int mid;
while (first != last) {
mid = (first+last)>>>1;
if (nums[mid] == target)
return true;
if (nums[first] < nums[mid]) {
if (nums[first] <= target && target < nums[mid]) {
last = mid;
} else {
first = mid + 1;
}
} else if (nums[first] > nums[mid]) {
if (nums[mid] < target && target <= nums[last - 1]) {
first = mid + 1;
} else {
last = mid;
}
} else {
// nums[first]==nums[mid],由于有重复元素存在,不能判断增减性,first加1
first++;
}
}
return false;
}
}
// @lc code=end
  • 在上述文件夹下新键Test类即Test.java文件用于测试,并将上述Solution类名改为S避免冲突:
1
2
3
4
5
6
7
8
public class Test {
public static void main(String[] args) {
S s1 = new S();
int[] nums = new int[]{1, 0, 1, 1, 1};
int target = 0;
System.out.println(s1.search(nums, target));
}
}
  • 以上述S类和Test类为例,由于在debug时实在本地查找相应的.class文件,所以需要在本地编译得到S.classTest.class后再调试(下述S.class可以由其他文件名的.java文件编译得到,如18.四数之和.java
  • 在下述位置打断点并点击Debug按钮进入调试:
  • 注意需要安装Extension Pack for Java以及Code Runner等插件,系统里需要安装java jdk。

参考资料:

  1. 免费 Leetcode Debug?教你用VSCode优雅的刷算法题!!!_哔哩哔哩_bilibili

C++本地调试

  • 同样以81.cpp为例,注意进行C++调试时.cpp文件和路径名中不要含有中文。81.cpp代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/*
* @lc app=leetcode.cn id=81 lang=cpp
*
* [81] 搜索旋转排序数组 II
*/

// @lc code=start
#include <bits/stdc++.h>
using namespace std;

//代码
//分析:允许重复元素,33题中如果 A[mid]>=A[first],则[first, mid]为递增序列不再成立。
class Solution {
public:
bool search(vector<int>& nums, int target) {
int first =0;
int last = nums.size();
int mid;
while(first!=last){
mid = first + (last-first)/2;
if(nums[mid]==target) return true;
if(nums[first]<nums[mid]){
if(nums[first]<=target && target<nums[mid]){
last=mid;
}else{
first=mid+1;
}
}else if(nums[first]>nums[mid]){
if(nums[mid]<target && target<=nums[last-1]){
first=mid+1;
}else{
last=mid;
}
}else{
//nums[first]==nums[mid],因为有重复元素的存在,不能判断增减性,first++
first++;
}
}
return false;
}
};
// @lc code=end
  • 直接在上述文件中添加main函数作为调试入口:
1
2
3
4
5
6
7
int main(){
vector<int> nums;
nums={1, 0, 1, 1, 1};
int target = 0;
Solution s;
cout << s.search(nums, target) << endl;
}
  • 在下述位置打断点并点击右上角Debug C/C++ File进行调试:
  • 注意在调试之前,需要配置好C++环境(即.vscode文件夹),并安装C/C++Code Runner等插件。

参考资料:
leetcode刷题本地调试模板(C++) – SAquariusの梦想屋
C++ vector<int>&nums 用法总结

康托展开和逆康托展开

参考资料:

  1. 康托展开和逆康托展开_wbin233的博客-CSDN博客_逆康托展开