数组的基础知识主要有声明与引用,赋值、遍历等,因为较常用,基本上都很熟悉,简单回顾一下动态数组的声明与引用。
静态数组在声明的时候就确定了数组的大小,并且不能修改,在实际中,经常会遇到这样一种情况,所需的空间取决于实际输入的数据,而无法预先确定,对于这种问题,可以使用动态数组来解决。
1、动态分配
一维数组:
int *array; // 数组指针
int arrLen; // 数组长度
int i; // 数组下标
array = (int*)malloc( arrLen*sizeof(int) );
二维数组:
#include
#include
int main(void)
{
int i, row, column;
int **arr;
while (scanf("%d %d", &row, &column) != EOF) {
arr = (int **)malloc(sizeof(int *) * row); // 分配所有行的首地址
for (i = 0; i < row; i ++) { // 按行分配每一列
arr[i] = (int *)malloc(sizeof(int) * column);
}
// 释放开辟的二维数组空间
for (int i = 0; i < row; ++i)
{
free(*(arr + i));
}
}
return 0;
}
2、引用
使用数组下标,从0到n-1(n为数组长度)
题目说明:
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
解题思路:
由于数组有序,使用两个指针从相邻的两个元素开始检查,如果相邻的两个元素不相同,就保留较小下标的元素值,将两个指针同时后移一位;如果两个元素值相同,保留较小下标元素的值,并将该指针向后移一位,另一个指针向后移动到与与该元素不相同为止;较大的指针指向数组的尾端就停止。
代码:
int removeDuplicates(int* nums, int numsSize) {
if (nums == NULL || numsSize <= 1)
return numsSize;
int i,j;
for (i=0,j=1; j
int maxProfit(int* prices, int pricesSize) {
int i, profit=0;
for (i=0; i prices[i])
profit += prices[i+1] - prices[i];
}
return profit;
}
void rotate(int* nums, int numsSize, int k) {
int i, j;
int flag_value;
int temp;
/* 排除异常情况 */
if(k > numsSize)
{
k = k % numsSize;
}
else if(k == 0)
{
return;
}
/* 循环移位 */
while(k>0)
{
temp = nums[0];
for(i = numsSize - 1; i >= 0; i--)
{
if(i == numsSize - 1)
nums[0] = nums[i];
else
nums[i + 1] = nums[i];
}
nums[1] = temp;
k--;
}
}
bool containsDuplicate(int* nums, int numsSize) {
int i = 0, j = 0;
for (i=0; i
int singleNumber(int* nums, int numsSize) {
int i;
int result = nums[0];
for(i=1; i
int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
if(nums1Size==0||nums2Size==0)
return NULL;
sort(nums1,nums1Size);
sort(nums2,nums2Size);
int *res,i,j;
res=(int *)malloc(sizeof(int)*nums1Size);
*returnSize=0;
for(i=0,j=0;i0; --i)
{
for(j=0; jnums[j+1])
{
int temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
}
}
}
}
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int* plusOne(int* digits, int digitsSize, int* returnSize) {
int k = 1, i,n=0;
for(i = 0;i=0; i--)
{
if((digits[i]+k)>9)
{
digits[i] = digits[i]+k-10;
continue;
}
else
{
digits[i] = digits[i]+k;
k = 0;
}
}
}
*returnSize=digitsSize;
return digits;
}
//解法1
void moveZeroes(int* nums, int numsSize) {
int i,len=0;
for(i=0;i 0){
nums[i-cnt_zeros] = nums[i];
nums[i] = 0;
}
}
}
int* twoSum(int* nums, int numsSize, int target) {
int i,j = 0;
static int twoSubscript[2];
for(i=0 ;i
bool isValidSudoku(char** board, int boardRowSize, int boardColSize) {
int i, j, k;
/* 判断每行数组中的值是否只出现一次 */
for(k = 0; k < boardRowSize; k++)
{
for(i = 0; i < boardColSize - 1; i++)
{
for(j = i + 1; j < boardColSize; j++)
{
if(board[k][i] == '.')
break;
else if(board[k][j] == '.')
continue;
else if(board[k][i] == board[k][j])
return false;
}
}
}
/* 判断每列数组中的值是否只出现一次 */
for(k = 0; k < boardColSize; k++)
{
for(i = 0; i < boardRowSize - 1; i++)
{
for(j = i + 1; j < boardRowSize; j++)
{
if(board[i][k] == '.')
break;
else if(board[j][k] == '.')
continue;
else if(board[i][k] == board[j][k])
return false;
}
}
}
/* 判断3x3矩阵中的值是否只出现一次 */
int a = 0, b = 0, c = 0, d = 0;
int row = 0, col = 0;
int num;
for(num = 0; num < 9; num++)
{
for(a = row; a < 3 + row; a++)
{
for(b = col; b < 3 + col; b++)
{
/* 判断值为.,则判断下一个 */
if(board[a][b] == '.')
{
continue;
}
/* 判断3x3矩阵是否有相等的值 */
for(c = 0 + row;c < 3 + row; c++)
{
for(d = 0 + col; d < 3 + col; d++)
{
if(board[c][d] == '.')
continue;
else if((a != c) && (b != d) && (board[a][b] == board[c][d]))
return false;
}
}
}
}
/* 移动至下一个3x3矩阵 */
col += 3;
if(col >= 9)
{
col = 0;
row += 3;
}
}
return true;
}
void rotate(int** matrix, int matrixRowSize, int *matrixColSizes) {
int i, j;
int n = matrixRowSize;
for (i=0; i