LeetCode_数组

大致

数组的遍历 485、495、414、628
统计数组中的元素 645、697、448、442、41、274
数组的改变、移动 453、665、283
二维数组及滚动数组 118、119、661、598、419
数组的旋转 189、396
特定顺序遍历二维数组 54、59、498
二维数组变换 566、48、73、289
前缀和数组 303、304、238

数组的遍历

485、495、414、628:遍历
在遍历中,比较某种频数的最大值或者最小值;或者在遍历中做特殊规律的运算

int max_num = a[0];
for (int i = 1; i < a.size(); i++) {
    max_num = max(a[i], max_num)
}

统计数组中的元素

645:利用哈利表统计元素个数
697:利用哈希表记录元素个数、出现最左位置、出现最右位置
448:利用set去重集合记录元素
442:利用索引原数组修改记录元素
41:哈希表记录;利用索引原数组修改记录元素
274:线性判断

利用哈希表、去重表等记录元素;
再者可能需要记录最左位置、出现最右位置等完成复杂需求;
追求speed者可在原数组上修改并统计,完成算法

数组的改变、移动

453:按规律修改数组,但最佳方法需寻得深层规律
665:最佳方法需寻得深层规律
283:寻得规律修改数组

修改数组,移动元素不是难点,难的是尽可能寻得规律,减少修改移动次数

二维数组及滚动数组

二维数组的修改。。。
滚动数组:有时二维数组的修改仅需要前K(1、2)个数组,这时候可以用到滚动数组,用K个一维数组保存原二维数组的数值,后只需要维护这K个一维数组即可

数组的旋转

顺时针旋转无非是:
1234(旋转次数k,例如k=2)
4123
3412
这时可以使用数组翻转

/**
 * 解法: 翻转数组
 * 时间复杂度: T(n) = O(n)
 * 空间复杂度: S(n) = O(1)
 */
public static void rotate2(int[] nums, int k) {
    k %= nums.length;
    reverse(nums, 0, nums.length - 1);
    reverse(nums, 0, k - 1);
    reverse(nums, k, nums.length - 1);
}
//翻转数组
public static void reverse(int[] arr, int start, int end) {
    int temp = 0;
    while (start < end) {
        temp = arr[start];
        arr[start] = arr[end];
        arr[end] = temp;
        start++;
        end--;
    }
}

特定顺序遍历二维数组

54:顺时针遍历二维数组
此类题型找出规律即可

二维数组变换

566、48:元素位置变换,使用辅助数组,找出下标变换规律即可
73、289:元素值变换,使用辅助数组记录或者,采用额外标记进行原地修改

前缀和数组

303:前缀和,arr[i]存放前面i个元素之和
304:二维数组的前缀和
238:复杂题型中灵活使用前缀和

//构建简单前缀和
int length = nums.length;
arr = new int[length + 1];
for (int i = 0; i < length; i++) {
    arr[i + 1] = arr[i] + nums[i];
}

具体代码在github:https://github.com/yuanzaizhichi/java_study

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值